计算列表列表中每个唯一项的出现次数

时间:2018-05-20 19:10:42

标签: python python-3.x

我有一个列表如下:

listoflist = [["A", "B", "A", "C", "D"], ["Z", "A", "B", "C"], ["D", "D", "X", "Y", "Z"]]

我想找到listoflist中每个唯一值出现的子列表的数量。例如,“A”显示在两个子列表中,而“D”也显示在两个子列表中,即使它在listoflist[3]中出现两次。

如何获得一列中包含每个唯一元素的数据帧和频率(每个唯一元素显示的子列表数)?

3 个答案:

答案 0 :(得分:3)

您可以将MatPaginatoritertools.chain一起使用:

collections.Counter

如@ Jean-FrançoisFabre的评论所述,您也可以使用:

In [94]: import itertools as it

In [95]: from collections import Counter

In [96]: Counter(it.chain(*map(set, listoflist)))
Out[96]: Counter({'A': 2, 'B': 2, 'C': 2, 'D': 2, 'X': 1, 'Y': 1, 'Z': 2})

答案 1 :(得分:2)

基本上,似乎你想要像

这样的东西
Counter(x for xs in listoflist for x in set(xs))

首先将每个列表转换为一个集合,以排除重复项。然后将集合序列平面映射并输入Counter

完整代码:

from collections import Counter

listoflist = [["A", "B", "A", "C", "D"], ["Z", "A", "B", "C"], ["D", "D", "X", "Y", "Z"]]

c = Counter(x for xs in listoflist for x in set(xs))

print(c)

结果:

# output:
# Counter({'B': 2, 'C': 2, 'Z': 2, 'D': 2, 'A': 2, 'Y': 1, 'X': 1})

答案 2 :(得分:1)

另一种方法是使用pandas:

import pandas as pd

df = pd.DataFrame(listoflist)
df.stack().reset_index().groupby(0)['level_0'].nunique().to_dict()

输出:

{'A': 2, 'B': 2, 'C': 2, 'D': 2, 'X': 1, 'Y': 1, 'Z': 2}