Я новичок в Python, и я пытаюсь решить эту проблему в сценарии.
У меня есть 2 списка словарей следующим образом:
en_list = [{'time': 840, 'text': "I want to introduce you to some\nvery wise kids that I've known,"},
{'time': 5480, 'text': 'but first I want\nto introduce you to a camel.'},
{'time': 8720, 'text': 'This is Cassie, a therapy camel\nvisiting one of our young patients'},
{'time': 13000, 'text': 'in her room,'},
{'time': 14920, 'text': 'which is pretty magical.'}]
fr_list = [{'time': 840, 'text': "Je veux vous présenter certains enfants\ntrès sages que j'ai rencontrés,"},
{'time': 5480, 'text': 'mais je veux commencer\npar vous présenter un chameau.'},
{'time': 8720, 'text': 'Voici Cassie, un chameau thérapeutique qui\nrend visite à une de nos jeunes patients'},
{'time': 14920, 'text': 'ce qui est plutôt magique.'}]
Я хочу создать новый список только с соответствующими значениями ключа времени.
Я придумал это, но, очевидно, он не учитывает ключ времени, хотя он работает просто отлично, если в обоих списках одинаковое количество словарей.
for i, m in enumerate(zip(en_list, fr_list), start=1):
print(i, m[0], "=", m[1])
Это распечатывает следующее:
1 {'time': 840, 'text': "I want to introduce you to some\nvery wise kids that I've known,"} = {'time': 840, 'text': "Je veux vous présenter certains enfants\ntrès sages que j'ai rencontrés,"}
2 {'time': 5480, 'text': 'but first I want\nto introduce you to a camel.'} = {'time': 5480, 'text': 'mais je veux commencer\npar vous présenter un chameau.'}
3 {'time': 8720, 'text': 'This is Cassie, a therapy camel\nvisiting one of our young patients'} = {'time': 8720, 'text': 'Voici Cassie, un chameau thérapeutique qui\nrend visite à une de nos jeunes patients'}
4 {'time': 13000, 'text': 'in her room,'} = {'time': 14920, 'text': 'ce qui est plutôt magique.'}
Как вы можете видеть, он неправильно сопоставил английский с 'time': 13000
на французский с 'time': 14920
, хотя в английском списке был правильный текст с тем же временем, но код выше игнорировал его.
Желаемый вывод должен включать все элементы с совпадающим значением клавиши «время» и игнорировать несовпадающие элементы. Как мне этого добиться?
Заранее спасибо за вашу поддержку!
3 ответа
Ваше решение, как вы сказали, не принимает во внимание значения времени. Чтобы создать для этого рабочее решение, нам нужно получить значения времени для каждого списка, выяснить, какие из них имеют общие значения, а затем отфильтровать исходные списки на основе общих значений времени.
# Make set of time values for given list.
get_times = lambda l: {d['time'] for d in l}
# Intersection of sets
times_shared = get_times(en_list) & get_times(fr_list)
# Get dicts whose time value is shared.
get_shared = lambda l: [d for d in l if d['time'] in times_shared]
for i, m in enumerate(zip(get_shared(en_list), get_shared(fr_list)), start=1):
print(i, m[0], '=', m[1])
Или вы можете сначала преобразовать списки в dicts (пары time: text
), что делает его намного проще:
makedict = lambda l: {d['time']: d['text'] for d in l}
en_dict = makedict(en_list)
fr_dict = makedict(fr_list)
# Intersection
times_shared = set(en_dict) & set(fr_dict)
for i, time in enumerate(times_shared, start=1):
print('%d %d %r = %r' % (i, time, en_dict[time], fr_dict[time]))
list(filter(lambda item: item[0].get('time') == item[1].get('time'), zip(en_list, fr_list)))
(Отредактировано): Может быть, это будет работать
result = []
for k, en in enumerate(en_list):
for fr in fr_list:
if en.get('time') == fr.get('time'):
result.append({k: '{} = {}'.format(en, fr)})
Составьте список из каждого dict, включая все значения time
. Найдите время, общее для обоих списков (составление другого списка). Итерируйте этот список общих времен, печатая соответствующий dict из каждого из ваших двух списков.
Каждый из этих шагов является общей техникой программирования, описанной в руководствах и других вопросах переполнения стека. Кодирование оставлено в качестве упражнения для студента.
Похожие вопросы
Новые вопросы
python
Python - это мультипарадигмальный динамически типизированный многоцелевой язык программирования, разработанный для быстрого (для изучения, использования и понимания) и для обеспечения чистого и унифицированного синтаксиса. Обычно используются две похожие, но несовместимые версии Python, Python 2.7 и 3.x. Для специфичных для версии вопросов Python добавьте тег [python-2.7] или [python-3.x]. При использовании варианта или библиотеки Python (например, Jython, PyPy, Pandas, Numpy), пожалуйста, включите их в теги.