【问题标题】:Splitting a list of tuples by 2nd element - python按第二个元素拆分元组列表 - python
【发布时间】:2014-01-14 10:49:25
【问题描述】:

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

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

还有其他方法吗?

【问题讨论】:

    标签: python filter tuples list-comprehension


    【解决方案1】:

    使用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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-25
      • 2023-03-12
      • 2015-01-12
      • 2012-03-08
      • 1970-01-01
      相关资源
      最近更新 更多