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

时间:2014-01-14 10:49:26

标签: python filter tuples list-comprehension

如何通过第二个元素拆分元组列表?

我可以用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)

任何其他方式?

1 个答案:

答案 0 :(得分:2)

使用collections.defaultdict() object

from collections import defaultdict

numbered = defaultdict(list)
for i in tup:
    numbered[i[1]].append(i)

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

演示:

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

defaultdict只是一个dict子类,具有其他行为;你可以在没有它的情况下做得更复杂,并且速度略有下降:

numbered = {}
for i in tup:
    numbered.setdefault(i[1], []).append(i)