【问题标题】:Comparing rows elements in python比较python中的行元素
【发布时间】:2012-07-27 11:05:22
【问题描述】:

我们有一个清单:

import numpy as np


A=[(2, 2, 0), (1, 5, 0), (6, 8, 0), (2, 2, 2) ]

ax=np.asarray([row[0] for row in A])
ay=np.asarray([row[1] for row in A])
az=np.asarray([row[2] for row in A])

print (ax,ay,az)

我想将 ax 与 ay 进行比较,当我找到 ax==ay 的相等对时,例如 (2, 2, 0) 和 (2, 2, 2) 我保留该对一次但添加 az 值。所以在我们的例子中,新的通缉名单 B 将是:

B=[(2, 2, 2), (1, 5, 0), (6, 8, 0)]

如果有一些代码对非常大的列表也很有效,那就太好了。

【问题讨论】:

    标签: python arrays list numpy compare


    【解决方案1】:

    字典(或 collections.Counter)比 numpy 数组检查当前项目更快。

    所以如果输出顺序不重要:

    from collections import Counter
    c = Counter()
    A = [(2, 2, 0), (1, 5, 0), (6, 8, 0), (2, 2, 2) ]
    for a in A:
        c[a[:2]] += a[2]
    B = [list(k) + [v] for k,v in c.iteritems()]
    

    B 现在是:

    [[1, 5, 0],  [6, 8, 0], [2, 2, 2]]
    

    【讨论】:

    • 我认为 OP 想要与同一 (x,y) 对关联的 z 值的总和,因此该行将是 [2, 2, 2] 而不是 [2, 2, 0]
    • 谢谢@eumiro,即使列表很大,您的代码也非常快。
    【解决方案2】:

    如果顺序不重要

    from collections import defaultdict
    
    dd = defaultdict(int)
    for x, y, z in A:
        dd[(x,y)] += z
    res = [k + (v,) for k, v in dd.iteritems()]
    # [(1, 5, 0), (6, 8, 0), (2, 2, 2)]
    

    如果订单很重要

    from operator import itemgetter
    
    d = {}
    for idx, (x, y, z) in enumerate(A):
        pos, freq = d.get((x,y), (0,0))
        d[(x,y)] = min(pos, idx), freq + z
    
    res = sorted((k + (v[1],) for k, v in d.iteritems()), key=itemgetter(1, 1))
    # [(2, 2, 2), (1, 5, 0), (6, 8, 0)]
    

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多