Найти наиболее часто встречающийся элемент / строку в списке списков - PullRequest
1 голос
/ 10 января 2020

У меня есть список списков в форме:

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 ]

1 голос
/ 11 января 2020

Учитывая, что основной проблемой является неиссякаемое свойство списков, здесь возможен обходной путь:

>>> 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
1 голос
/ 10 января 2020

Чао Томми: 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])
1 голос
/ 10 января 2020

Использование Pandas

>>> 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]
1 голос
/ 10 января 2020

Если порядок списка имеет значение, вы можете просто преобразовать подсписок в строку и сравнить его.

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})

Конечно, вы также можете использовать свой метод, в любом случае вы получите строка, и вы можете найти список из строки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...