【问题标题】:How to get the sums of unique values with respective occurrence count from a list in Python?如何从 Python 中的列表中获取具有相应出现次数的唯一值的总和?
【发布时间】:2021-07-26 06:50:32
【问题描述】:

这样的列表:

[1,1,1,2,2,3,3,3]

我想得到每个唯一数字[1,2,3] 的总和,即[3, 4, 9]。使用相关帖子How to get unique values with respective occurrence count from a list in Python? 中的一种方法,我可以使用以下方法获取每个唯一编号的出现计数:

L = [1,1,1,2,2,3,3,3]
uniq, counts = np.unique(L, return_counts=True)
counts

它给出了输出[3, 2, 3]。有了这个,我就可以通过枚举For Loop 和一些相当神秘的条件来获得我正在寻找的东西:

L = [1,1,1,2,2,3,3,3]
elements = [3,2,3]
    
sums = []
index = 0
for i, e in enumerate(elements):
    if i == 0:
        sums.append(sum(L[0:e]))
        index = index + e
    else:
        sums.append(sum(L[index:index + e]))
        index = index + e
print(sums)

这给出了所需的输出[3, 4, 9]。有谁知道是否可以更优雅地做同样的事情?

【问题讨论】:

  • 我会使用 collections.Counter

标签: python


【解决方案1】:

此解决方案假定唯一编号已组合在一起:

from itertools import groupby

numbers = [1, 1, 1, 2, 2, 3, 3, 3]

print([sum(group) for _, group in groupby(numbers)])

输出:

[3, 4, 9]
>>> 

【讨论】:

    【解决方案2】:

    由于您使用的是 Numpy,因此您可以将 np.unique 已有的结果相乘:

    import numpy as np
    
    L = [1,1,1,2,2,3,3,3]    
    uniq, counts = np.unique(L, return_counts=True)
    
    uniq * counts
    # array([3, 4, 9])
    

    【讨论】:

    • 我想起了一句关于森林和一些树木的老话......我真的应该看到这个......
    • 为了我的辩护,我的现实世界问题是字符串列表和数字列表的组合。我在问题中的最小示例也应该真正反映这一点,
    • @vestland 是的,这肯定会使解决方案不那么简洁。
    • 但是你的方法很可能是对我的问题最简洁的答案,所以我很乐意将其标记为已接受的答案,稍后再试一次,更准确地描述我的现实世界挑战.
    【解决方案3】:

    你可以使用collections.Couter()

    from collections import Counter
    
    >>>L = [1,1,1,2,2,3,3,3]
    >>>[k*v for k,v in Counter(L).items()]
    [3, 4, 9]
    

    或在字典中:

    >>>{k:k*v for k,v in Counter(L).items()}
    {1: 3, 2: 4, 3: 9}
    

    【讨论】:

      【解决方案4】:

      您可以使用defaultdictdict 执行类似操作

      使用defaultdict:

      from collections import defaultdict
      
      a = [1, 1, 1, 2, 2, 3, 3, 3]
      out = defaultdict(int)
      
      for k in a :
          out[k] += k
      
      print(list(out.values()))
      # [3, 4, 9]
      

      使用dict

      a = [1, 1, 1, 2, 2, 3, 3, 3]
      out = {}
      
      for k in a:
          if k in out:
              out[k] += k
          else:
              out[k] = k
      
      print(list(out.values()))
      # [3, 4, 9]
      

      【讨论】:

        猜你喜欢
        • 2011-01-24
        • 1970-01-01
        • 2020-08-19
        • 1970-01-01
        • 1970-01-01
        • 2016-11-11
        • 1970-01-01
        • 1970-01-01
        • 2020-02-06
        相关资源
        最近更新 更多