2014-01-14 39 views
1

如何分割第二元素的元组列表?由第二元素分割元组列表 - python

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

还有其他方法吗?

回答

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) 
相关问题