#python #list #dictionary
#python #Список #словарь
Вопрос:
Я пытаюсь добавлять строки в список внутри словаря, чтобы у каждого участника был список слов. Вот мой код:
words = [
{'word': 'we', 'start_time': 90, 'participant': 'str_MIC_Y6E6_con_VnGhveZbaS'},
{'word': "haven't", 'start_time': 91, 'participant': 'str_MIC_Y6E6_con_VnGhveZbaS'},
{'word': 'even', 'start_time': 91, 'participant': 'str_MIC_Y6E6_con_VnGhveZbaS'},
{'word': 'spoken', 'start_time': 91, 'participant': 'str_MIC_Y6E6_con_VnGhveZbaS'},
{'word': 'about', 'start_time': 92, 'participant': 'str_MIC_Y6E6_con_VnGhveZbaS'},
{'word': 'your', 'start_time': 92, 'participant': 'str_MIC_Y6E6_con_VnGhveZbaS'},
{'word': 'newest', 'start_time': 92, 'participant': 'str_MIC_Y6E6_con_VnGhveZbaS'},
{'word': 'some word here', 'start_time': 45, 'participant': 'other user'}
]
words.sort(key=lambda x: x['start_time'])
clean_transcript = []
wordChunk = {'participant': '', 'words': []}
for w in words:
if wordChunk['participant'] == w['participant']:
wordChunk['words'].append(w['word'])
else:
wordChunk['participant'] = w['participant']
print(wordChunk['participant'])
wordChunk['words'].append(w['word'])
clean_transcript.append(wordChunk)
Это дает мне этот результат:
[{'participant': 'str_MIC_Y6E6_con_VnGhveZbaS', 'words': ['some word here', 'we', "haven't", 'even', 'spoken', 'about', 'your', 'newest']}]
Таким образом, some word here
находится в неправильном списке. Как мне нужно изменить это, чтобы также создать собственный список слов для other user
?
Ответ №1:
вы можете немного переструктурировать свои данные и просто сохранить их в dict, в котором участники являются ключами:
wordChunk = {}
for w in words:
wordChunk.setdefault(w["participant"],[]).append(w["word"])
wordChunk теперь является dict с участниками в качестве ключей:
>>> wordChunk
{'str_MIC_Y6E6_con_VnGhveZbaS': ['we', "haven't", 'even', 'spoken', 'about', 'your', 'newest'], 'other user': ['some word here']}
Ответ №2:
Вы можете использовать itertools.groupby
from itertools import groupby
res = []
words = sorted(words, key = lambda x: x['start_time'])
for k, g in groupby(words, key = lambda x: x['participant']):
d = {'participant': k, 'words': [x['word'] for x in g]}
res.append(d)
print(res)
Вывод:
[{'participant': 'other user', 'words': ['some word here']}, {'participant': 'str_MIC_Y6E6_con_VnGhveZbaS', 'words': ['we', "haven't", 'even', 'spoken', 'about', 'your', 'newest']}]
Использование понимания списка
res = [{'participant': k, 'words': [x['word'] for x in g]} for k, g in
groupby(sorted(words, key=lambda x: x['start_time']), key=lambda x: x['participant'])]