Создать новый список словарей из других списков? - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть список повторяющихся слов и другой список слов, которые не повторяются следующим образом (все они находятся в текстовых файлах):

file1.txt:
listRepeat = ['aaa','aaa', 'bbb', 'ccc', 'ddd', 'bbb', 'ddd']

file2.txt:
listRepeat = ['aaa','eee', 'bbb', 'eee', 'bbb', 'ddd']

и следующий список, который содержит неповторяющиеся элементы файлы:

listEND = ['aaa', 'bbb', 'ccc', 'ddd', 'eee']

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

[{'file1.txt':['aaa':2], ['bbb':2], ['ccc':1], ['ddd':2], ['eee':0]}]
[{'file2.txt':['aaa':1], ['bbb':2], ['ccc':0], ['ddd':1], ['eee':2]}]

Идея состоит в том, чтобы заполнить мой список словарей элементами списков файлов и сказать число из этих элементов в списке элементов, так же, как в примере выше, но я не понимаю конструкцию этого словаря. Мой код выглядит следующим образом:

for i in listEND:
        newllist.append({file:[i,listRepeat.count(i)]})

Где newlist - это словарный список, где он помещает соответствующий file в качестве ключа словаря и в качестве элементов элементы и их соответствующее количество в i , Но результат таков:

{'file1.txt': ['aaa', 2]}
{'file1.txt': ['bbb', 2]}
{'file1.txt': ['ccc', 1]}
...

и так далее. Кто-нибудь знает, где не так в коде?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2020

Попробуйте:

file1 = ['aaa','aaa', 'bbb', 'ccc', 'ddd', 'bbb', 'ddd']
file2 = ['aaa','eee', 'bbb', 'eee', 'bbb', 'ddd']

listEND = ['aaa', 'bbb', 'ccc', 'ddd', 'eee']

file_contents = {"file1.txt":file1, "file2.txt":file2}


new_list = {filename:{x:lst.count(x) for x in listEND} for filename, lst in file_contents.items()}
print(new_list)

Вывод:

{'file1.txt': {'aaa': 2, 'bbb': 2, 'ccc': 1, 'ddd': 2, 'eee': 0}, 'file2.txt': {'aaa': 1, 'bbb': 2, 'ccc': 0, 'ddd': 1, 'eee': 2}}
0 голосов
/ 10 февраля 2020

Ваш желаемый вывод недействителен. Похоже, что вы на самом деле хотите вложенные диктовки:

{'file1.txt': {'aaa': 2, 'bbb': 2, 'ccc': 1, 'ddd': 2, 'eee': 0},
 'file2.txt': {'aaa': 1, 'bbb': 2, 'ccc': 0, 'ddd': 1, 'eee': 2}}

Чтобы это произошло в вашем коде, выглядело бы так:

...
for i in listEND:
    newdict[file][i] = listRepeat.count(i)

Но перед этим шагом вам нужно определить newdict = {} и newdict[file] = {}.


Кстати, вы можете использовать collections.Counter, но это работает немного иначе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...