Как создать словарь из списка списков в Python? - PullRequest
1 голос
/ 12 ноября 2019

Учитывая список списков, как я могу создать словарь, в котором ключами являются все элементы списка (одна копия), а значения - это количество раз, которое они являются первым элементом в списке?

Дано:

[['banana', 'oranges', 'grapes'],['banana', 'grapes'],['grapes', 'oranges', 'banana']]

Ожидается:

{'banana': 2, 'grapes': 1, 'oranges': 0}

Ответы [ 4 ]

0 голосов
/ 12 ноября 2019

Создать список списков:

ll = [['banana', 'oranges', 'grapes'], ['banana', 'grapes'], ['grapes', 'oranges', 'banana']]

Получить уникальные ключи:

from itertools import chain

d = dict.fromkeys(chain(*ll), 0)

Подсчитать первые элементы списков:

from collections import Counter
from operator import itemgetter

c = Counter(map(itemgetter(0), ll))

Обновить и показать результат:

d.update(dict(c))
print(d)

Отпечатки:

{'banana': 2, 'oranges': 0, 'grapes': 1}
0 голосов
/ 12 ноября 2019

Сначала получите список первых элементов:

filtered_list = [x[0] for x in initial_list]

И вот ваши уникальные элементы:

unique_elements = set([y for x in initial_list for y in x])

Теперь инициализируйте словарь с ключами из уникальных элементов и нулевыми значениями:

counts = {e: 0 for e in unique_elements}

Наконец, обновите значения словаря частотами каждого элемента в отфильтрованном списке. Поскольку вы просили решение без counter, вот простой цикл для достижения этого:

for i in filtered_list:
    counts[i] = counts.get(i, 0) + 1

print(counts)
# {'banana': 2, 'grapes': 1, 'oranges': 0}
0 голосов
/ 12 ноября 2019

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

initial_list = [['banana', 'oranges', 'grapes'],['banana', 'grapes'],['grapes', 'oranges', 'banana']]

unique = set()

for l in initial_list:
    unique = unique.union(set(l))

Затем подсчитать, сколько в списке присутствует каждый элемент (при условии, что каждый элемент присутствует или отсутствует, не дублируется):

from collections import defaultdict

result = defaultdict(lambda: 0)
for element in unique:
    for l in initial_list:
        result[element] += (element == l[0])

Значение по умолчанию используется для получения начального значения 0 И ваш результат должен быть в result

Используется тот факт, что bool является подклассом intдля оценки element == l[0] либо 1, либо 0

Без collections вам необходимо отредактировать последнюю строку так:

try:
    result[element] += (element == l[0])
except KeyError:
    result[element] = 1
0 голосов
/ 12 ноября 2019

Простая реализация

l = [['banana', 'oranges', 'grapes'],['banana', 'grapes'],['grapes', 'oranges', 'banana']]
unique_items = set([i for sl in l for i in sl])
d = dict()
for item in unique_items:
    d[item] = 0

for sublist in l:
    d[sublist[0]] += 1

print(d)
# output
# {'grapes': 1, 'oranges': 0, 'banana': 2}

Для поддержания порядка

d = dict()
for sl in l:
    d[sl[0]] = d.get(sl[0],0) + 1
print(d)
# {'banana': 2, 'grapes': 1}

unique_items = set([i for sl in l for i in sl])
for item in unique_items:
    if item not in d:
        d[item] = 0
print(d)
# {'banana': 2, 'grapes': 1, 'oranges': 0}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...