Словарь словаря со значением списка - PullRequest
1 голос
/ 10 марта 2020

Я хотел добавить соответствующие ключи в словаре в списке строк

myDictionary = {'johny': [], 'Eli': [], 'Johny': [], 'Jane': [], 'john': [], 'Ally': []}

votes = ['johny', 'Eli', 'Eli', 'Jane', 'Ally', 'Johny', 'john', 'Eli']

outPut={'johny': ['johny'], 'Eli': ['Eli','Eli'], 'Johny': ['Johny'], 'Jane': ['Jane'], 'john': ['john'], 'Ally': ['Ally']}

Я пытался сделать так, но добавляю весь список в каждую клавишу

votes_dictionary={}
votes_dictionary=votes_dictionary.fromkeys(votes,[])
for i in votes:
    print(i.lower())
    votes_dictionary[i].append(i)
print(votes_dictionary)

Ответы [ 5 ]

5 голосов
/ 10 марта 2020

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

from collections import defaultdict

votes = ['johny', 'Eli', 'Eli', 'Jane', 'Ally', 'Johny', 'john', 'Eli']
votes_dictionary = defaultdict(list)

for vote in votes:
    votes_dictionary[vote].append(vote)


# votes_dictionary will be an instance of defaultdict
# to convert it to dict, just call dict
print(dict(votes_dictionary))


# outpout
{'johny': ['johny'], 'Eli': ['Eli', 'Eli', 'Eli'], 'Jane': ['Jane'], 'Ally': ['Ally'], 'Johny': ['Johny'], 'john': ['john']}
0 голосов
/ 10 марта 2020
votes_dictionary = {}
votes_dictionary = votes_dictionary.fromkeys(votes)
for i in votes:
    if not votes_dictionary[i]:
        votes_dictionary[i] = []
    votes_dictionary[i].append(i)
print(votes_dictionary)

Было опубликовано много ответов, если вы действительно хотите использовать метод fromkeys (), вы можете сделать что-то вроде этого

0 голосов
/ 10 марта 2020
myDictionary = {'johny': [], 'Eli': [], 'Johny': [], 'Jane': [], 'john': [], 'Ally': []}

votes = ['johny', 'Eli', 'Eli', 'Jane', 'Ally', 'Johny', 'john', 'Eli']

for x in votes:
   myDictionary[x].append(x)
0 голосов
/ 10 марта 2020
votes_dictionary={}
for i in votes:
    try:
        votes_dictionary[i].append(i)
    except KeyError:
        votes_dictionary[i] = [i]
print(votes_dictionary)
0 голосов
/ 10 марта 2020

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

output = {}

for name in votes:
    output.setdefault(name, [])
    output[name].append(name)
print(output)

Вывод:

{'johny': ['johny'],
 'Eli': ['Eli', 'Eli', 'Eli'],
 'Jane': ['Jane'],
 'Ally': ['Ally'],
 'Johny': ['Johny'],
 'john': ['john']}

Или,

import copy
output = copy.deepcopy(mydictionary)
for name in votes:
    output[name].append(name)
print(output):

вывод:

{'johny': ['johny'],
 'Eli': ['Eli', 'Eli', 'Eli'],
 'Johny': ['Johny'],
 'Jane': ['Jane'],
 'john': ['john'],
 'Ally': ['Ally']}

Теперь, если вы хотите ограничить до двух, даже если есть три элемента:

output = {}
for name in votes:
# to maintain the order, you can iterate over `mydictionary`
    output[name] = [name]*min(2, votes.count(name))
print(output)

вывод:

{'johny': ['johny'],
 'Eli': ['Eli', 'Eli'],
 'Jane': ['Jane'],
 'Ally': ['Ally'],
 'Johny': ['Johny'],
 'john': ['john']}

Другой Интересный способ добиться двух вхождений Eli будет, itertools.groupby:

>>> from itertools import groupby
>>> {key: [*group] for key, group in groupby(reversed(votes))}
{'Eli': ['Eli', 'Eli'],
 'john': ['john'],
 'Johny': ['Johny'],
 'Ally': ['Ally'],
 'Jane': ['Jane'],
 'johny': ['johny']}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...