按第二个元素拆分元组列表-python

按第二个元素拆分元组列表-python,python,filter,tuples,list-comprehension,Python,Filter,Tuples,List Comprehension,如何按第二个元素拆分元组列表 我可以通过以下两种方式完成: tup = [('x',1),('y',2),('z',1)] ones = [i for i in tup if i[1] == 1] twos = [i for i in tup if i[1] == 2] 但是有没有办法避免在列表中重复两次呢?像这样 ones, twos = [], [] for i in tup: if i[1] == 1: ones.append(i) if i[1] == 2:

如何按第二个元素拆分元组列表

我可以通过以下两种方式完成:

tup = [('x',1),('y',2),('z',1)]

ones = [i for i in tup if i[1] == 1]
twos = [i for i in tup if i[1] == 2]
但是有没有办法避免在列表中重复两次呢?像这样

ones, twos = [], []

for i in tup:
  if i[1] == 1:
    ones.append(i)
  if i[1] == 2:
    twos.append(i)
还有其他方法吗?

使用:

现在,
numbered[1]
包含所有的一个,
numbered[2]
包含所有两个的列表。此解决方案自然地扩展到更多的
i[1]
值,而无需定义任何附加列表或
if
语句

演示:

from collections import defaultdict

numbered = defaultdict(list)
for i in tup:
    numbered[i[1]].append(i)
>>> from collections import defaultdict
>>> tup = [('x',1),('y',2),('z',1)]
>>> numbered = defaultdict(list)
>>> for i in tup:
...     numbered[i[1]].append(i)
... 
>>> numbered
defaultdict(<type 'list'>, {1: [('x', 1), ('z', 1)], 2: [('y', 2)]})
>>> numbered[1]
[('x', 1), ('z', 1)]
>>> numbered[2]
[('y', 2)]
numbered = {}
for i in tup:
    numbered.setdefault(i[1], []).append(i)