我有一个列表,看起来像这样
List = [q1,a1,q2,a2,q3,a3]
我需要最终的代码类似于这样。
dictionary = {q1:a1,q2:a2,q3:a3}
如果我能获取特定索引处的值,比如List[0],我就可以完成这个任务,有没有办法获取它呢?
我有一个列表,看起来像这样
List = [q1,a1,q2,a2,q3,a3]
dictionary = {q1:a1,q2:a2,q3:a3}
如果我能获取特定索引处的值,比如List[0],我就可以完成这个任务,有没有办法获取它呢?
可以使用dict
类来构建Python字典,只需提供包含元组的可迭代对象即可。我们可以将其与内置的range
函数结合使用,生成一个元组集合(每个奇数项,每个偶数项),并将其传递给dict
函数,使值以键值对的形式在最终结果中组织:
dictionary = dict([(List[i], List[i+1]) for i in range(0, len(List), 2)])
使用扩展切片符号:
dictionary = dict(zip(List[0::2], List[1::2]))
使用基于范围的答案更简单,但也可以使用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 的敏锐眼力进行了双重校正。
]
。 - Chris Lutziter(List) * 2
不是有效的方法。 - Chris Lutzd = {}
for i in range(0, len(List), 2):
d[List[i]] = List[i+1]
你在评论中提到了有重复的条目。我们可以处理这个问题。选择你喜欢的生成元组列表的方法,并将其扩展为一个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)
我们最后使用一个字典,其中所有的键都是集合,而这些集合包含值。这仍然可能不太合适,因为像字典一样,集合也不能包含重复元素,所以如果你需要单个键来持有两个相同的值,那么你需要将其改为元组或列表。但这应该能帮助你入门。
[]
,将列表解析改为生成器以获得更高的效率:dict((List[i], List[i+1]) for i in range(0, len(List), 2))
这样,它不会生成一个列表,然后在转换为字典后将其丢弃。 - Chris Lutz