2013-09-05 2 views
27

есть ли какой-нибудь pythonic способ конвертировать набор в dict?Set to dict Python

я получил следующий набор

s = {1,2,4,5,6} 

и хотите следующий Dict

c = {1:0, 2:0, 3:0, 4:0, 5:0, 6:0} 

со списком вы могли бы сделать

a = [1,2,3,4,5,6] 
b = [] 

while len(b) < len(a): 
    b.append(0) 

c = dict(itertools.izip(a,b)) 
+0

тесно связаны: [Наиболее Pythonic способ построить словарь из Единого списка] (http://stackoverflow.com/ д/14258984). –

+0

И вместо 'while' цикла, добавляющего' 0', почему бы не сделать 'b = [0] * len (a)'? Или используйте 'itertools.izip (a, itertools.repeat (0))'. –

+0

Хотелось бы использовать карту и сделать лямбда! – shuva

ответ

50

Использование dict.fromkeys():

c = dict.fromkeys(s, 0) 

Демо:

>>> s = {1,2,4,5,6} 
>>> dict.fromkeys(s, 0) 
{1: 0, 2: 0, 4: 0, 5: 0, 6: 0} 

Это работает для списков, а также; это самый эффективный способ создания словаря из последовательности. Обратите внимание, что все значения являются ссылками на этот по умолчанию, который вы передали в dict.fromkeys(), поэтому будьте осторожны, если это значение по умолчанию является изменяемым объектом.

11

Кроме того, метод заданного @Martijn Pieters, вы можете также использовать словарь понимание, как это:

s = {1,2,4,5,6} 
d = {e:0 for e in s} 

Этот метод работает медленнее, чем dict.fromkeys(), но он позволяет установить значение в Словаре на все, что вам нужно, в случае, если вы не всегда хотите, чтобы он был равен нулю.

Вы также можете использовать его для создания списков, списки понятий являются более быстрыми и более питоническими, чем цикл, который у вас есть в вашем вопросе. Вы можете узнать больше о постижений здесь: http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions

+2

Этот метод используется, если значение по умолчанию является изменяемым, и для каждого ключа требуется новый объект. 'dict.fromkeys()' is * far * быстрее в противном случае. –

+2

См. [Самый питонический путь создания словаря из одного списка] (http://stackoverflow.com/q/14258984) для сравнения. –

+0

Правда, понимание медленнее. – papirrin

4

Это еще один способ сделать

s = {1,2,3,4,5} 
dict([ (elem, 0) for elem in s ])