我有一个看起来像这样的列表
List = [q1,a1,q2,a2,q3,a3]
我需要最终的代码是这样的
dictionary = {q1:a1,q2:a2,q3:a3}
如果我只能获得某个索引的值,例如List [0]我可以做到这一点,有什么方法可以得到它吗?
答案 0 :(得分:11)
Python字典可以使用dict
类构造,给定包含元组的迭代。我们可以将它与range
内置结合使用,以生成元组集合(每个奇数项,每个偶数项),并将其传递给dict
,以便值在最终结果中将自己组织成键/值对:
dictionary = dict([(List[i], List[i+1]) for i in range(0, len(List), 2)])
答案 1 :(得分:11)
使用扩展切片表示法:
dictionary = dict(zip(List[0::2], List[1::2]))
答案 2 :(得分:3)
基于范围的答案更简单,但使用itertools包还有另一种方法:
from itertools import izip
dictionary = dict(izip(*[iter(List)] * 2))
打破此局面(此次编辑测试):
# Create instance of iterator wrapped around List
# which will consume items one at a time when called.
iter(List)
# Put reference to iterator into list and duplicate it so
# there are two references to the *same* iterator.
[iter(List)] * 2
# Pass each item in the list as a separate argument to the
# izip() function. This uses the special * syntax that takes
# a sequence and spreads it across a number of positional arguments.
izip(* [iter(List)] * 2)
# Use regular dict() constructor, same as in the answer by zzzeeek
dict(izip(* [iter(List)] * 2))
编辑:非常感谢Chris Lutz对双重修正的敏锐眼光。
答案 3 :(得分:2)
d = {}
for i in range(0, len(List), 2):
d[List[i]] = List[i+1]
答案 4 :(得分:0)
您在评论中提到您有重复的条目。我们可以用这个。采用您最喜欢的生成元组列表的方法,并将其扩展为for
循环:
from itertools import izip
dictionary = {}
for k, v in izip(List[::2], List[1::2]):
if k not in dictionary:
dictionary[k] = set()
dictionary[k].add(v)
或者我们可以使用collections.defaultdict
,因此我们无需检查密钥是否已初始化:
from itertools import izip
from collections import defaultdict
dictionary = defaultdict(set)
for k, v in izip(List[::2], List[1::2]):
dictionary[k].add(v)
我们将以字典结束,其中所有键都是集合,并且集合包含值。这仍然可能不合适,因为像字典这样的集合不能保留重复项,因此如果您需要一个键来保存两个相同的值,则需要将其更改为元组或列表。但这应该让你开始。