Python拆分列表包含元组

问题描述 投票:1回答:1

我将看到一个完全由元组组成的列表,例如:'

lst = [("hello", "Blue"), ("hi", "Red"), ("hey", "Blue), ("yo", "Green")]

我如何将lst分成尽可能多的颜色列表?在这种情况下,有4个列表

[("hello", "Blue"), ("hey", "Blue)]

[("hi", "Red")]

[("yo", "Green")]

我只需要稍后使用这些列表,所以我不想只将它们输出到屏幕上。

有关列表的详细信息

[我知道lst的每个元素严格都是双元素元组。颜色也总是将成为每个元组的第二个元素。问题是,lst取决于用户输入,因此我将永远不会知道总共有多少种颜色以及它们是什么。这就是为什么我无法预定义变量以将这些列表存储在它们中的原因。

那怎么办?

python list indexing tuples slice
1个回答
0
投票

您可以这样做:

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')]]


0
投票

这可以在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

并且可以从resultdict.values()中收集列表:

d = split_by_idx(lst)
print(list(d.values()))

0
投票

您可以使用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')]})
© www.soinside.com 2019 - 2024. All rights reserved.