我将看到一个完全由元组组成的列表,例如:'
lst = [("hello", "Blue"), ("hi", "Red"), ("hey", "Blue), ("yo", "Green")]
我如何将lst
分成尽可能多的颜色列表?在这种情况下,有4个列表
[("hello", "Blue"), ("hey", "Blue)]
[("hi", "Red")]
[("yo", "Green")]
我只需要稍后使用这些列表,所以我不想只将它们输出到屏幕上。
有关列表的详细信息
[我知道lst
的每个元素严格都是双元素元组。颜色也总是将成为每个元组的第二个元素。问题是,lst
取决于用户输入,因此我将永远不会知道总共有多少种颜色以及它们是什么。这就是为什么我无法预定义变量以将这些列表存储在它们中的原因。
那怎么办?
您可以这样做:
lst = [("hello", "Blue"), ("hi", "Red"), ("hey", "Blue"), ("yo", "Green")]
colors = {elem[1] for elem in lst}
lsts = []
for color in colors:
color_lst = [elem for elem in lst if elem[1] == color]
lsts.append(color_lst)
[colors
包含lst
中存在的唯一颜色,lsts
将包含您需要的最后3个列表。
lsts
最终是:[[('hi', 'Red')], [('yo', 'Green')], [('hello', 'Blue'), ('hey', 'Blue')]]
。
这可以在dict
的支持下相对有效地完成:
def split_by_idx(items, idx=2):
result = {}
for item in items:
key = item[idx]
if key not in result:
result[key] = []
result[key].append(item)
return result
并且可以从result
和dict.values()
中收集列表:
d = split_by_idx(lst)
print(list(d.values()))
您可以使用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')]})