У меня есть список гнезд, как показано ниже:
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 }
Как это получить?
list - это зарезервированное ключевое слово в python3. выберите другое имя.
@Rahul Это не зарезервированное ключевое слово. Если бы это было так, его код был бы SyntaxError. Однако это является - встроенное имя, поэтому его повторно использовать плохо - если вам нужно, например, составить список из кортежа, вы больше не можете вызывать list(tup), потому что list теперь означает список пользователей вместо встроенный тип списка.
Он построен в классе. Если вы используете его как переменную, у вас будет встроенная функция ovwrride, и многие вещи могут не работать, которые полагаются на нее, например list(iterable), который преобразует любой итерируемый в список, defaultdict(list), который создает список по умолчанию для списка и т. д. Так что в некотором смысле зарезервировано.
@abarnert аналогично dict, tuple также зарезервированы.
@Rahul: Да, именно поэтому я сказал «это встроенное имя» и объяснил, почему повторно использовать это имя плохо, на примере list(tup), поэтому вам не нужно объяснять мне то же самое, что я сказал. Но «в некотором роде сдержанно» - это неправда. «Зарезервировано» имеет значение - это означает конкретный небольшой набор слов, которые вы не можете использовать в качестве имен идентификаторов, не получив SyntaxError (или запутав синтаксический анализатор), и list не входит в их число.






Сначала список можно выровнять, объединив все элементы (удаление внутренних элементов из списка) в один список, а затем используя 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))
Последний, кажется, действительно то, что он хочет, хотя я понятия не имею, почему он хочет привязать свои числа.
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}
список - это зарезервированное ключевое слово. Пожалуйста, не практикуйте это, по крайней мере, пока вы отвечаете.
Сделать это очень легко, всего одна строка кода:
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 да! но здесь только потому, что вопрос не эффективен require.
Всего одна строка для фактической логики (подключите ваш 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
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
зачем столько суеты. это просто. см. ответ других.
Я лично обычно не смотрю на другие ответы, но каждый пользователь индивидуален. Почему? Потому что теоретически как можно больше ответов и как можно больше разных способов дает OP больше возможностей. Когда я задаю вопрос, я лично приветствую как можно больше ответов по этой причине. Я узнаю больше. В Python есть миллион способов сделать что-то, что может быть не самым быстрым для одной проблемы, но может быть лучшим для другой, поэтому мне лично нравится как можно больше ответов, но каждый плакат индивидуален, и я уважаю это. Я понимаю твою точку зрения, Рахул.
@Rahul Я предполагал, что список может быть многократно вложенным. Есть ли в Python простой способ сгладить многократно вложенный список? Спасибо.
@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] не сглаживается.
Если я правильно понимаю, у вас есть список списков, и вы хотите добавить сумму количества раз, когда значение появляется в списке списков (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}
Вы можете просто сделать:
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}
Трудно сказать по твоему объяснению. а вы просто ищете
collections.Counter?