Получение 5 наиболее часто встречающихся элементов во вложенном списке (из строк) с collection.Counter - PullRequest
0 голосов
/ 23 октября 2018

У меня есть такой список

L = [['16.37.123.153','119.222.456.130','38673','161','17','62','4646'],
 ['16.37.456.153','119.222.123.112','56388','161','17','62','4646'],..]

И я хочу получить 5 наиболее часто встречающихся элементов этого списка с collection.counter.

Когда я использую это решение:

mostfrequentelements, counterofelements = zip(*Counter(L).most_common(5))

Я получаю ошибку:

Traceback (most recent call last):
  File "hypergraph.py", line 65, in <module>
    mostfrequent, countermfi = zip(*Counter(L).most_common(5)) 
  File "/usr/lib/python2.7/collections.py", line 477, in __init__
    self.update(*args, **kwds)
  File "/usr/lib/python2.7/collections.py", line 567, in update
    self[elem] = self_get(elem, 0) + 1
TypeError: unhashable type: 'list'

Как я могу использовать ее для моего типа списка?Мне нужно решение с оптимальной временной сложностью.

Ввод:

L = [['16.37.123.153','119.222.456.130','38673','161','17','62','4646'],
     ['16.37.456.153','119.222.123.112','56388','161','17','62','4646'],..]

Ввод:

Mostfrequentlelements = list of 5 most occuring sublists
Counter = list of the occurence counts of the 5 sublists

Заранее спасибо, Привет:)

1 Ответ

0 голосов
/ 23 октября 2018

Вы передаете вложенный список вместо последовательности.Вам нужно получить доступ к каждому списку в вашем списке L перед использованием счетчика.

Вы можете создать список счетчиков и получить значения позже.

L = [['16.37.123.153','119.222.456.130','38673','161','17','62','4646'],
 ['16.37.456.153','119.222.123.112','56388','161','17','62','4646']]

from collections import Counter

c = [Counter(i) for i in L]

for item in c:
    print(item.most_common(5))

Обновить

Чтобы подсчитать каждый список, вы можете объединить их в строку и сосчитать их:

L = [['16.37.123.153','119.222.456.130','38673','161','17','62','4646'],
 ['16.37.456.153','119.222.123.112','56388','161','17','62','4646']]

from collections import Counter

L = [','.join(i) for i in L]
c = Counter(L).most_common(5)

Mostfrequentlelements = [i[0] for i in c]
Counts = [i[1] for i in c]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...