Answers:
b = dict(zip(a[::2], a[1::2]))
如果a
很大,您可能需要执行以下操作,而不会像上面那样创建任何临时列表。
from itertools import izip
i = iter(a)
b = dict(izip(i, i))
在Python 3中,您也可以使用dict理解,但具有讽刺意味的是,我认为最简单的方法是使用range()
and len()
,通常是代码味道。
b = {a[i]: a[i+1] for i in range(0, len(a), 2)}
因此iter()/izip()
,尽管EOL在注释中指出,该方法可能仍是Python 3中使用最多的Python语言,但在Python 3 zip()
中已经很懒了,因此您不需要izip()
。
i = iter(a)
b = dict(zip(i, i))
如果您只想一行,就必须作弊并使用分号。;-)
zip(i, i)
,在Python 3中,因为zip()
现在返回一个迭代器。
dict(x[i:i+2] for i in range(0, len(x), 2))
如果您有这个:
a = ['bi','double','duo','two']
并且您想要这样做(列表中的每个元素都键入一个给定值(本例中为2)):
{'bi':2,'double':2,'duo':2,'two':2}
您可以使用:
>>> dict((k,2) for k in a)
{'double': 2, 'bi': 2, 'two': 2, 'duo': 2}
fromkeys
。 >>> dict.fromkeys(a, 2) {'bi': 2, 'double': 2, 'duo': 2, 'two': 2}
我觉得很酷,这是如果您的清单只有2个项目:
ls = ['a', 'b']
dict([ls])
>>> {'a':'b'}
请记住,dict接受任何包含iterable的iterable,其中iterable中的每个项目本身必须是恰好有两个对象的iterable。
可能不是最pythonic的,但是
>>> b = {}
>>> for i in range(0, len(a), 2):
b[a[i]] = a[i+1]
enumerate
for i, key in enumerate(a[::2]):
。不过unpythonic因为字典构造能为你做的大部分工作在这里
for i, key in enumerate(a[::2]):
方法的工作原理?生成的对值将为0 hello
和1 1
,我不清楚如何使用它们来产生{'hello':'world', '1':'2'}
。
enumerate(a)[::2]
您可以非常快地完成此操作,而无需创建额外的数组,因此即使在非常大的数组中也可以使用:
dict(izip(*([iter(a)]*2)))
如果您有发电机a
,甚至更好:
dict(izip(*([a]*2)))
以下是摘要:
iter(h) #create an iterator from the array, no copies here
[]*2 #creates an array with two copies of the same iterator, the trick
izip(*()) #consumes the two iterators creating a tuple
dict() #puts the tuples into key,value of the dictionary
{'hello':'hello','world':'world','1':'1','2':'2'}
)
您也可以这样操作(在此将字符串转换为列表,然后转换为字典)
string_list = """
Hello World
Goodbye Night
Great Day
Final Sunset
""".split()
string_list = dict(zip(string_list[::2],string_list[1::2]))
print string_list
对于这种转换,我也非常感兴趣,因为这样的列表是Perl中哈希的默认初始化程序。
这个线程给出了异常全面的答案-
使用Python 2.7生成器表达式,可以发现我是Python的新手。
dict((a[i], a[i + 1]) for i in range(0, len(a) - 1, 2))
您也可以尝试这种方法将键和值保存在其他列表中,然后使用dict方法
data=['test1', '1', 'test2', '2', 'test3', '3', 'test4', '4']
keys=[]
values=[]
for i,j in enumerate(data):
if i%2==0:
keys.append(j)
else:
values.append(j)
print(dict(zip(keys,values)))
输出:
{'test3': '3', 'test1': '1', 'test2': '2', 'test4': '4'}
{x: a[a.index(x)+1] for x in a if a.index(x) % 2 ==0}
result : {'hello': 'world', '1': '2'}