我有一个元组列表。
[('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
列表中。
答案 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])