如何根据第二个值对元组列表进行排序而不对其进行硬编码

时间:2021-07-09 20:10:54

标签: python

我有一个元组列表。

[('first_title', 'first_content','notes'),('second_title','second_content','Lists'), ('third_title', 'third_content','Books'), ('fourth_title', 'fourth_content','Chores')

并且我想获取代码中的每个元组并将它们放在一个列表中,其中该列表只有具有相同第二个值(从 0 开始)的元组,但没有硬编码第二个值或列表的长度.所以结果看起来像...

notes = [('first_title, 'first_content, 'notes')]
Lists = [('second_title, 'second_content, 'Lists')]
Books = [('third_title, 'third_content, 'Books')]
Chores = [('fourth_title, 'fourth_content, 'Chores')]

所以我真的做不到...

if x[2] == 'Lists'

因为它是硬编码的。

如果有另一个元组的第二个元素(从 0 开始)等于 'Books',那么它将在 Books 列表中。

2 个答案:

答案 0 :(得分:3)

您想创建一个列表字典,其中每个元组中的第三个值用作键。

您可以使用 defaultdict 在第一次插入密钥时自动创建一个新列表:

from collections import defaultdict

result = defaultdict(list)

for item in list_of_tuples:
    key = item[2]
    result[key].append(item)

现在您可以使用 result['notes']result['Lists']

答案 1 :(得分:0)

您似乎在寻找filter

这将允许您像这样重用一些代码(如果您想更加灵活但不是必需的,请使用选择器):

inp = [('first_title', 'first_content','notes'),('second_title','second_content','Lists'), ('third_title', 'third_content','Books'), ('fourth_title', 'fourth_content','Chores')]

def get_by(category, l, selector=lambda x: x[2]):
    return filter(l, lambda x: selector(x) == category)

然后我可以获得类别:

get_by('Books', inp)

或者我可以根据其他条件更改选择器和过滤器:

get_by('first_title', inp, selector=lambda x: x[0])