Как заставить словарь показывать количество отображаемых чисел?

У меня есть список гнезд, как показано ниже:

list = [
    [1, 2, 4, 5],
    [2, 3, 4, 5],
    [1, 3, 4, 5, 6],
    [1, 2, 3],
]

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

{ '1': 3, 
  '2': 3, 
  '3': 3, 
  '4': 3, 
  '5': 3, 
  '6': 1 }

Как это получить?

Трудно сказать по твоему объяснению. а вы просто ищете collections.Counter?

abarnert 12.03.2018 04:42
list - это зарезервированное ключевое слово в python3. выберите другое имя.
Rahul 12.03.2018 05:09

@Rahul Это не зарезервированное ключевое слово. Если бы это было так, его код был бы SyntaxError. Однако это является - встроенное имя, поэтому его повторно использовать плохо - если вам нужно, например, составить список из кортежа, вы больше не можете вызывать list(tup), потому что list теперь означает список пользователей вместо встроенный тип списка.

abarnert 12.03.2018 17:32

Он построен в классе. Если вы используете его как переменную, у вас будет встроенная функция ovwrride, и многие вещи могут не работать, которые полагаются на нее, например list(iterable), который преобразует любой итерируемый в список, defaultdict(list), который создает список по умолчанию для списка и т. д. Так что в некотором смысле зарезервировано.

Rahul 13.03.2018 03:02

@abarnert аналогично dict, tuple также зарезервированы.

Rahul 13.03.2018 03:06

@Rahul: Да, именно поэтому я сказал «это встроенное имя» и объяснил, почему повторно использовать это имя плохо, на примере list(tup), поэтому вам не нужно объяснять мне то же самое, что я сказал. Но «в некотором роде сдержанно» - это неправда. «Зарезервировано» имеет значение - это означает конкретный небольшой набор слов, которые вы не можете использовать в качестве имен идентификаторов, не получив SyntaxError (или запутав синтаксический анализатор), и list не входит в их число.

abarnert 13.03.2018 03:09
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
6
99
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Ответ принят как подходящий

Сначала список можно выровнять, объединив все элементы (удаление внутренних элементов из списка) в один список, а затем используя Counter:

from collections import Counter
dict(Counter(inneritem for item in list for inneritem in item))

Результат:

{1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 1}

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

dict(Counter(str(inneritem) for item in list for inneritem in item))

Последний, кажется, действительно то, что он хочет, хотя я понятия не имею, почему он хочет привязать свои числа.

abarnert 12.03.2018 04:50
list = [
    [1, 2, 4, 5],
    [2, 3, 4, 5],
    [1, 3, 4, 5, 6],
    [1, 2, 3],
]

tmp = {}
for item_list in list:
    for item in item_list:
        if str(item) in tmp.keys():
            tmp[str(item)] += 1
        else:
            tmp[str(item)] = 1

print(tmp)

результат:

{'1': 3, '2': 3, '3': 3, '4': 3, '5': 3, '6': 1}

список - это зарезервированное ключевое слово. Пожалуйста, не практикуйте это, по крайней мере, пока вы отвечаете.

Rahul 12.03.2018 04:59

Сделать это очень легко, всего одна строка кода:

import collections

lst = [
    [1, 2, 4, 5],
    [2, 3, 4, 5],
    [1, 3, 4, 5, 6],
    [1, 2, 3],
]
dict(collections.Counter(sum(lst, [])))

НЕ используйте list в качестве имени переменной, здесь я использую lst.

sum поверх последовательностей - плохая идея. Вложенное понимание, chain.from_iterable, или любая из альтернатив будет по крайней мере столь же ясной и не будет иметь проблемы с квадратичной производительностью.
abarnert 12.03.2018 04:52

@abarnert да! но здесь только потому, что вопрос не эффективен require.

Frank AK 12.03.2018 13:51

Всего одна строка для фактической логики (подключите ваш list и примените к нему Counter):

from collections import Counter
from itertools import chain


Counter(chain.from_iterable(list))

PS. Подумайте о том, чтобы переименовать переменную list в другое имя, так как это ключевое слово Python.

Сначала измените свою переменную с list на что-то еще, например, my_list

Вам нужно сначала сгладить список, а затем подсчитать элемент с помощью счетчика.

from collections import Counter
from itertools import chain

print(dict(Counter(chain(*my_list))))

out:
{1: 3, 2: 3, 4: 3, 5: 3, 3: 3, 6: 1}

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

print(
    dict(
        Counter(
            [
                str(item)
                for sub_list in my_list
                    for item in sub_list
            ]
        )
    )
)# or
#print(dict(Counter([str(item) for sub_list in my_list for item in sub_list])))
out:
{'1': 3, '2': 3, '4': 3, '5': 3, '3': 3, '6': 1}

Согласно вопросу, ключи на выходе dict - это str. В любом случае мне нравится этот +1

Sohaib Farooqi 12.03.2018 05:01
lst = [
    [1, 2, 4, 5],
    [2, 3, 4, 5],
    [1, 3, 4, 5, 6],
    [1, 2, 3],
]

d = {}
def ravel(lst):
    if not isinstance(lst, list):
        if lst not in d: 
            d[lst] = 1
        else: 
            d[lst] += 1
    elif lst:
        for i in lst:
            ravel(i)

ravel(lst)
print d

зачем столько суеты. это просто. см. ответ других.

Rahul 12.03.2018 05:00

Я лично обычно не смотрю на другие ответы, но каждый пользователь индивидуален. Почему? Потому что теоретически как можно больше ответов и как можно больше разных способов дает OP больше возможностей. Когда я задаю вопрос, я лично приветствую как можно больше ответов по этой причине. Я узнаю больше. В Python есть миллион способов сделать что-то, что может быть не самым быстрым для одной проблемы, но может быть лучшим для другой, поэтому мне лично нравится как можно больше ответов, но каждый плакат индивидуален, и я уважаю это. Я понимаю твою точку зрения, Рахул.

Simeon Ikudabo 12.03.2018 06:06

@Rahul Я предполагал, что список может быть многократно вложенным. Есть ли в Python простой способ сгладить многократно вложенный список? Спасибо.

NORTMP 14.03.2018 10:23

@Rahul Я попробовал ваш ответ, но он неверен. Вот входящий список: my_list = [[1, 2, 4, 5], [2, 3, 4, 5], [1, 3, 4, 5, 6], [1, [2, 3], 3]] Ваше первое решение вызывает исключение: unhashable type: 'list' Вывод других решений: {'1': 3, '[2, 3]': 1, '3': 3, '2': 2, ' 5 ': 3,' 4 ': 3,' 6 ': 1} Вложенный список [2, 3] не сглаживается.

NORTMP 15.03.2018 03:18

Если я правильно понимаю, у вас есть список списков, и вы хотите добавить сумму количества раз, когда значение появляется в списке списков (1-6), и хотите, чтобы сумма раз, когда значение появлялось как значение в dict, а конкретное число (1-6) будет «ключом» dict. Вот код ниже, который может дать вам желаемый результат:

 list_ = [
[1, 2, 4, 5],
[2, 3, 4, 5],
[1, 3, 4, 5, 6],
[1, 2, 3],
]
one = []
two = []
three = []
four = []
five = []
six = []

for num in list_[0]:
       if num == 1:
           one.append(num)

       if num == 2:
           two.append(num)

       if num == 3:
           three.append(num)

       if num == 4:
           four.append(num)

       if num == 5:
           five.append(num)

       if num == 6:
           six.append(num)


for num in list_[1]:
       if num == 1:
           one.append(num)

       if num == 2:
           two.append(num)

       if num == 3:
           three.append(num)

       if num == 4:
           four.append(num)

       if num == 5:
           five.append(num)

       if num == 6:
           six.append(num)


for num in list_[2]:
       if num == 1:
           one.append(num)

       if num == 2:
           two.append(num)

       if num == 3:
           three.append(num)

       if num == 4:
           four.append(num)

       if num == 5:
           five.append(num)

       if num == 6:
           six.append(num)

for num in list_[3]:
       if num == 1:
           one.append(num)

       if num == 2:
           two.append(num)

       if num == 3:
           three.append(num)

       if num == 4:
           four.append(num)

       if num == 5:
           five.append(num)

       if num == 6:
           six.append(num)


list_dict = {}

list_dict['1'] = len(one)

list_dict['2'] = len(two)

list_dict['3'] = len(three)

list_dict['4'] = len(four)

list_dict['5'] = len(five)

list_dict['6'] = len(six)

print(list_dict)

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

{'1': 3, '2': 3, '3': 3, '4': 3, '5': 3, '6': 1}
  1. Я создал ваш список списков (вложенный список).
  2. Я создал пустые списки, в которых будет храниться каждое из 6 чисел.
  3. Я создал четыре цикла for (по одному для каждого индекса в вашем списке списков), которые добавляют каждое число к соответствующему пустому списку.
  4. После того, как я сделал это для каждого индекса, я создал пустой словарь с именем list_dict. Я сделал ключи словаря числами, которые вы хотели (1-6), а значения - длиной пустых словарей, которые мы создали ранее, которые теперь содержат каждое вхождение числа из вашего списка списков. Это даст вам результат, который вы ищете.

Вы можете просто сделать:

list1 = [
    [1, 2, 4, 5],
    [2, 3, 4, 5],
    [1, 3, 4, 5, 6],
    [1, 2, 3],
]

count = {}

for i in list1:
  for j in i:
    if j not in count:
      count[j]=1
    else:
      count[j]+=1

print(count)

выход:

{1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 1}

Другие вопросы по теме