【问题标题】:Count values of sublists子列表的计数值
【发布时间】:2021-04-14 21:00:48
【问题描述】:

假设我有一个 Python 列表,其中每个元素代表一天以及商店中有多少产品:

l = [
    [a, a, a, b, c],
    [a, a, b, b, c],
    [a, b, b, c, c]
]

我想创建一个摘要,显示:

Day 1: a:3, b:1, c:1 
Day 2: a:2, b:2, c:1 
Day 3: a:1, b:2, c:2

我需要一种格式,以便我可以绘制一段时间内的产品可用性图表。

我试过这个:

from collections import Counter
    
Counter(x for sublist in l for x in sublist)

但这会将所有列表中的元素向上计数,而不是返回每个子列表的结果。

谢谢大家,这是包括图表在内的最终解决方案:

from collections import Counter
d = {i:Counter(sublist) for i, sublist in enumerate(l, start=1)}
df = pd.DataFrame.from_dict(d, orient='index').reset_index()
df = df.melt('index', var_name='product',  value_name='vals')
df['product'] = df['product'].map({'A': 'a', 'B': 'b','C': 'c','D': 'd'})
sns.lineplot(x="index", y="vals", hue='product', data=df)

【问题讨论】:

  • 试试这个[Counter(sublist) for sublist in l]

标签: python list dictionary counter


【解决方案1】:

试试dict comprehension:

>>> {f'Day {i}': Counter(sublist) for i, sublist in enumerate(l, start=1)}
{'Day 1': Counter({'a': 3, 'b': 1, 'c': 1}),
 'Day 2': Counter({'a': 2, 'b': 2, 'c': 1}),
 'Day 3': Counter({'a': 1, 'b': 2, 'c': 2})}

【讨论】:

  • 不错的答案。请注意,Counter 可以从结果中删除,每个对象都替换为dict,方法是将Counter(sublist) 更改为dict(Counter(sublist)),我希望这通常是首选。
  • @Steve True,但是我觉得涉及计数的情况很少,应该首选 dict 而不是 Counter。除非它依赖于丢失键的某些东西。
  • 你可能是对的。对Counter 类没有深入了解,如果我只需要dict,我宁愿安全使用它并摆脱它的使用。即使我对Counter 对象的行为有专业知识,稍后可能会出现另一个缺乏该知识的程序员。在那一点上,我看到了从最终结果中去除Counter 的使用的明显优势。我的想法是其他人可能也会将此视为优势,但也许我错了。
【解决方案2】:

更简单丑陋的c版本,你可以根据需要改变

>>> for i in l:
...     x=Counter(i)
...     print(x['a'],'a')
...     print(x['b'],'b')
...     print(x['c'],'c')

您可以通过枚举列表来检索索引

【讨论】:

  • 这不会产生满足规定要求的结果:“以一种我可以绘制一段时间内产品可用性的格式”。
猜你喜欢
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-28
  • 1970-01-01
相关资源
最近更新 更多