在列表列表中查找最频繁的元素/行

时间:2020-01-10 16:14:26

标签: python-3.x list numpy

我有以下形式的列表列表:

my_list = [[8, [16, 32], [32, 16, 8], 0],
           [16, [16, 32], [32, 16, 8], 0],
           [16, [32, 64], [32, 16, 8], 0],
           [8, [16, 32], [32, 16, 8], 0]]

,我想提取最频繁的项目,即:

most_freq_item = [8, [16, 32], [32, 16, 8], 0]

我尝试将列表转换为numpy,然后使用np.unique:

import numpy as np
list_as_np = np.asarray(my_list)
unq, cnt = np.unique(list_as_np, axis=0, return_counts=True)

但这会引发TypeError: The axis argument to unique is not supported for dtype object,因为np.asarray确实创建了一个对象,而不是适当的np.ndarray。

有什么建议吗?非常感谢!

4 个答案:

答案 0 :(得分:1)

如果列表的顺序确实很重要,则只需将子列表转换为字符串并进行比较即可。

from collections import Counter
Counter([str(x) for x in my_list])
# Counter({'[8, [16, 32], [32, 16, 8], 0]': 2,
#         '[16, [16, 32], [32, 16, 8], 0]': 1,
#         '[16, [32, 64], [32, 16, 8], 0]': 1})

当然,您也可以使用您的方法,任一种方法都会为您提供一个字符串,并且您可以从该字符串中找到列表

答案 1 :(得分:1)

Ciao Tommi:D

另一个选择是:

import scipy.stats as ss
most_frequent, cnt = ss.mode([str(x) for x in my_list])

most_frequent
array(['[8, [16, 32], [32, 16, 8], 0]'], dtype='<U30')

cnt
array([2])

答案 2 :(得分:1)

使用熊猫

>>> s = pd.Series(map(str, my_list))
>>> s.value_counts()

[8, [16, 32], [32, 16, 8], 0]     2
[16, [32, 64], [32, 16, 8], 0]    1
[16, [16, 32], [32, 16, 8], 0]    1

要获取最频繁的元素:

s.value_counts().index[0]

答案 3 :(得分:1)

鉴于主要问题是列表的不可散列属性,这里是一种可能的解决方法:

>>> import pandas as pd
>>> my_list = [[8, [16, 32], [32, 16, 8], 0],
           [16, [16, 32], [32, 16, 8], 0],
           [16, [32, 64], [32, 16, 8], 0],
           [8, [16, 32], [32, 16, 8], 0]]

>>> l = [sum([[e] if type(e) == int else e for e in s], []) for s in my_list]

>>> l
[[8, 16, 32, 32, 16, 8, 0],
 [16, 16, 32, 32, 16, 8, 0],
 [16, 32, 64, 32, 16, 8, 0],
 [8, 16, 32, 32, 16, 8, 0]]

>>> df = pd.DataFrame(l)

>>> result = df.groupby(df.columns.tolist()).size()
>>> most_freq, cnt = result.idxmax(), result.max()

>>> most_freq
(8, 16, 32, 32, 16, 8, 0) 

>>> cnt
2