如何通过第二个元素拆分元组列表?
我可以用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)
任何其他方式?
答案 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)