Я новичок в 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, хотя в английском списке был правильный текст с тем же временем, но код выше игнорировал его.

Желаемый вывод должен включать все элементы с совпадающим значением клавиши «время» и игнорировать несовпадающие элементы. Как мне этого добиться?

Заранее спасибо за вашу поддержку!

-1
MZEID 20 Авг 2018 в 19:23

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]))
0
wjandrea 21 Авг 2018 в 20:16
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)})
0
Higor Rossato 20 Авг 2018 в 22:06

Составьте список из каждого dict, включая все значения time. Найдите время, общее для обоих списков (составление другого списка). Итерируйте этот список общих времен, печатая соответствующий dict из каждого из ваших двух списков.

Каждый из этих шагов является общей техникой программирования, описанной в руководствах и других вопросах переполнения стека. Кодирование оставлено в качестве упражнения для студента.

0
Prune 20 Авг 2018 в 16:30
51934897