我有以下形式的列表列表:
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。
有什么建议吗?非常感谢!
答案 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