繁体   English   中英

创建一个字典,将列表中元素的长度作为键

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM