Sorting sub-lists into new sub-lists based on common first items (4个答案)
Split a list of tuples into sub-lists of the same tuple field [duplicate] (3个答案)
在12个月前关闭。
出现一个完全由元组组成的列表,例如:
lst = [("hello", "Blue"), ("hi", "Red"), ("hey", "Blue"), ("yo", "Green")]
如何将
lst
分成颜色尽可能多的列表?在这种情况下,有3个列表
[("hello", "Blue"), ("hey", "Blue")]
[("hi", "Red")]
[("yo", "Green")]
我只需要稍后才能使用这些列表,所以我不想只将它们输出到屏幕上。
有关列表的详细信息
我知道
lst
的每个元素严格都是双元素元组。颜色也总是将成为每个元组的第二个元素。
问题问题是,
lst
取决于用户输入,因此我将永远不会知道总共有多少种颜色以及它们是什么。这就是为什么我不能预定义变量以将这些列表存储在它们中的原因。
那怎么办呢?
您可以使用 collections.defaultdict
按颜色分组:
from collections import defaultdict
lst = [("hello", "Blue"), ("hi", "Red"), ("hey", "Blue"), ("yo", "Green")]
colours = defaultdict(list)
for word, colour in lst:
colours[colour].append((word, colour))
print(colours)
# defaultdict(<class 'list'>, {'Blue': [('hello', 'Blue'), ('hey', 'Blue')], 'Red': [('hi', 'Red')], 'Green': [('yo', 'Green')]})
或者,如果您不喜欢不使用任何库,则可以选择
dict.setdefault
:
colours = {}
for word, colour in lst:
colours.setdefault(colour, []).append((word, colour))
print(colours)
# {'Blue': [('hello', 'Blue'), ('hey', 'Blue')], 'Red': [('hi', 'Red')], 'Green': [('yo', 'Green')]}
如果只希望将颜色元组分成多个元组的嵌套列表,则将
values()
打印为列表:
print(list(colours.values()))
# [[('hello', 'Blue'), ('hey', 'Blue')], [('hi', 'Red')], [('yo', 'Green')]]
上述方法的好处是,当您添加新键时,它们会自动为新键初始化空列表,因此您不必自己这样做。