[英]Create a dictionary with length of elements in a list as keys
我有一个列表,其中有多个作为元组存储在列表中的元素,我想创建一个字典,其中的键是像1,2等这样的长度以及各个长度的元素。 清单的例子是
combination = [('A',), ('B',), ('C',), ('D',), ('A', 'B'), ('A','C'),
('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D'), ('A', 'B', 'C'),
('A', 'B', 'D'), ('A', 'C', 'D'), ('B', 'C', 'D'),('A', 'B', 'C', 'D')]
我已经尝试过temp_dict = {len(i): i for i in combinations}
所需的输出是
{1: [('A',), ('B',), ('C',), ('D',)], 2: [('A', 'B'), ('A','C'),
('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')], 3: [('A', 'B', 'C'),
('A', 'B', 'D'), ('A', 'C', 'D'), ('B', 'C', 'D')], 4: [('A', 'B', 'C', 'D')]}```
您可以尝试其中包含列表理解的字典理解
temp_dict = {len(i): [x for x in combination if len(x) == len(i)] for i in combination}
print(temp_dict)
或者您可以使用setdefault
:
temp_dict = {}
for i in combination:
temp_dict.setdefault(len(i), []).append(i)
print(temp_dict)
两者输出:
{1: [('A',), ('B',), ('C',), ('D',)], 2: [('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')], 3: [('A', 'B', 'C'), ('A', 'B', 'D'), ('A', 'C', 'D'), ('B', 'C', 'D')], 4: [('A', 'B', 'C', 'D')]}
您当前的方法{len(i): i for i in combination}
实际上选择了特定长度的最后一个元组,并将其添加到字典中,这不是您想要的,而是您想要所有这些元组的列表。
您可以使用collections.defaultdict创建列表的字典作为值。 然后,您可以遍历列表并将相同长度的元组附加到键上
from collections import defaultdict
res = defaultdict(list)
#Iterate over the list
for item in combination:
#Append tuples with same length to same value list
res[len(item)].append(item)
print(dict(res))
输出将是
{1: [('A',), ('B',), ('C',), ('D',)],
2: [('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')],
3: [('A', 'B', 'C'), ('A', 'B', 'D'), ('A', 'C', 'D'), ('B', 'C', 'D')],
4: [('A', 'B', 'C', 'D')]}
另一种方法是使用itertools.groupby
。 请注意, groupby
假定您的数据已排序 。
from itertools import groupby
{k: list(g) for k, g in groupby(combination, key=len)}
输出:
{1: [('A',), ('B',), ('C',), ('D',)],
2: [('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')],
3: [('A', 'B', 'C'), ('A', 'B', 'D'), ('A', 'C', 'D'), ('B', 'C', 'D')],
4: [('A', 'B', 'C', 'D')]}
另一个itertools.groupby
是通过itertools.groupby
:
>>> from itertools import groupby
>>> dict([(cnt, list(l)) for cnt, l in groupby(combinations, len)])
{1: [('A',), ('B',), ('C',), ('D',)], 2: [('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')], 3: [('A', 'B', 'C'), ('A', 'B', 'D'), ('A', 'C', 'D'), ('B', 'C', 'D')], 4: [('A', 'B', 'C', 'D')]}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.