Python: Как вернуть список отдельных элементов с количеством из списка списков, который включает дубликаты? - PullRequest
0 голосов
/ 02 октября 2018

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

count_list = [['a', 'b'],['d', 'e'], ['e'], ['c'], ['a', 'b'], ['c']]
    distinct_list = []
    count_list.sort()
    for x in count_list:
        if x not in distinct_list: 
            distinct_list.append(x)       
    for z in distinct_list:
        for y in count_list:
            if y == z:
                print(z, count_list.count(z))

Я пытаюсь получить вывод в виде словаря / списка только с отчетливымивложенные списки и их количество, чтобы я мог отсортировать результаты по количеству.Списки не принимают двух значений, поэтому я думаю сделать словарь более удобным для хранения.Это результаты, которые я получаю из приведенного выше кода.

(['a', 'b'], 2)
(['a', 'b'], 2)
(['c'], 2)
(['c'], 2)
(['d', 'e'], 1)
(['e'], 1)

Я хочу, чтобы выходные данные содержали только одну строку для каждого отдельного списка и его соответствующее количество (а не несколько строк для одного и того же списка, как показано втоковый выход выше).Есть идеи?

Ответы [ 4 ]

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

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

count_list = [tuple(i) for i in count_list]

d = {i: count_list.count(i) for i in set(count_list)}
{('a', 'b'): 2, ('d', 'e'): 1, ('c',): 2, ('e',): 1}
0 голосов
/ 02 октября 2018

Получение результатов в виде диктата (в соответствии с одной из ваших первоначальных идей о том, как справиться с этим) также было бы довольно простым, если вы в порядке с преобразованием вложенных списков в кортежи, чтобы их можно было использовать в качестве ключей.Например:

data = [['a', 'b'],['d', 'e'], ['e'], ['c'], ['a', 'b'], ['c']]

results = {}
for d in data:
    t = tuple(d)
    if t not in results:
        results[t] = data.count(d)

print(results)

# OUTPUT
# {('a', 'b'): 2, ('d', 'e'): 1, ('e',): 1, ('c',): 2}
0 голосов
/ 02 октября 2018

Если вы не хотите использовать какие-либо библиотеки, хотя Counter является родным для python, вы можете сделать ...

arr = [[1, 2], [3], [1, 2], [4], [3]]
new_arr = []
for elem in arr:
    # You are wrapping your element in a list, at the same scale
    # than the list you wish to output (meaning 3 dimensions depth list).
    # In other words, you have a list... that contains a list, containing
    # your element and its count. The first depth seems useless at first glance,
    # but it's just here to keep the same depth you will have appending to new_arr.

    # You can try by yourself doing "obj = [elem, arr.count(elem)]" if you don't
    # believe me.
    obj = [ [elem, arr.count(elem)] ]
    if obj[0] not in new_arr:
        # checking on first index to check our elem and not our ""wrapper""
        new_arr += obj

print(new_arr)
# [[[1, 2], 2], [[3], 2], [[4], 1]]
0 голосов
/ 02 октября 2018

Вы должны использовать collections.Counter():

>>> count_list = [['a', 'b'],['d', 'e'], ['e'], ['c'], ['a', 'b'], ['c']]
>>> import collections
>>> result = collections.Counter(tuple(x) for x in count_list)
>>> print(result)
Counter({
    ('c',): 2,
    ('a', 'b'): 2,
    ('d', 'e'): 1,
    ('e',): 1
})
...