代码之家  ›  专栏  ›  技术社区  ›  user2657817

比较Python中的计数器列表

  •  4
  • user2657817  · 技术社区  · 6 年前

    我有一个python计数器列表:

    [Counter({12.011: 30.0, 15.999: 2.0}),
    Counter({12.011: 12.0, 15.999: 2.0}),... Counter({12.011: 40.0, 
    15.999: 5.0, 79.904: 5.0})]
    

    2 回复  |  直到 6 年前
        1
  •  4
  •   Dani Mesejo    6 年前

    您可以将每个计数器转换为键、值(项)元组的冻结集,然后将其用作传递给计数器的元素(因为冻结集是可散列的),例如:

    import random
    
    from collections import Counter
    
    random.seed(42)
    
    counts = [Counter([random.randint(0, 2) for _ in range(10)]) for _ in range(10)]
    
    uniques = {frozenset(e.items()): e for e in counts}
    
    counters_count = Counter(map(lambda e : frozenset(e.items()), counts))
    
    for key, count in counters_count.items():
        print uniques[key], count
    

    输出

    Counter({0: 7, 1: 2, 2: 1}) 1
    Counter({1: 4, 2: 4, 0: 2}) 1
    Counter({0: 4, 1: 4, 2: 2}) 2
    Counter({0: 4, 1: 3, 2: 3}) 1
    Counter({0: 5, 2: 3, 1: 2}) 1
    Counter({1: 5, 2: 5}) 1
    Counter({0: 5, 1: 4, 2: 1}) 1
    Counter({0: 4, 2: 4, 1: 2}) 1
    Counter({2: 4, 0: 3, 1: 3}) 1
    
        2
  •  5
  •   DeepSpace    6 年前

    Counter 柜台 .

    在Python中>=3.7有更好的方法。因为 柜台 dict 字典 现在保持它们的顺序,就可以使用每个 柜台

    from collections import Counter
    
    li = [Counter({'a': 1, 'b': 2, 'c': 3}),
          Counter({'a': 1, 'b': 2, 'c': 4}),
          Counter({'a': 1, 'b': 3, 'c': 3}),
          Counter({'a': 1, 'b': 2, 'c': 3})]
    
    
    Counter.__hash__ = lambda counter: hash(str(counter))
    
    print(Counter(li))
    # Counter({Counter({'c': 3, 'b': 2, 'a': 1}): 2,
    #          Counter({'c': 4, 'b': 2, 'a': 1}): 1,
    #          Counter({'b': 3, 'c': 3, 'a': 1}): 1})