Есть ли эффективный способ объединения двух списков кортежей в python, основанных на общем значении. В настоящее время я делаю следующее:Объединить списки по значению
name = [
(9, "John", "Smith"),
(11, "Bob", "Dobbs"),
(14, "Joe", "Bloggs")
]
occupation = [
(9, "Builder"),
(11, "Baker"),
(14, "Candlestick Maker")
]
name_and_job = []
for n in name:
for o in occupation:
if n[0] == o[0]:
name_and_job.append((n[0], n[1], n[2], o[1]))
print(name_and_job)
возвращается:
[(9, 'John', 'Smith', 'Builder'), (11, 'Bob', 'Dobbs', 'Baker'), (14, 'Joe', 'Bloggs', 'Candlestick Maker')]
Хотя этот код работает прекрасно для небольших списков, это невероятно медленно для длинных списков с миллионами записей. Есть ли более эффективный способ написать это?
EDIT Номера в первом столбце уникальны.
EDIT Измененный код @John Kugelman. Добавленный Get(), только в том случае, словарь имен не имеет соответствующий ключ в словаре оккупационного:
>>>> names_and_jobs = {id: names[id] + (jobs.get(id),) for id in names}
>>>> print(names_and_jobs)
{9: ('John', 'Smith', None), 11: ('Bob', 'Dobbs', 'Baker'), 14: ('Joe', 'Bloggs', 'Candlestick Maker')}
Для выполнения часто правая структура данных является ключевым. Используй словарь. –
Оставляя мой удаленный ответ в качестве комментария для пользователей <10k. * Если * ваш список уверен в наличии * точно совпадающих записей, то вы можете использовать ['zip'] (https://docs.python.org/2/library/functions.html#zip) вместе с [списком (https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions), как в [[x [0], x [1], x [2], y [1]) для x, y в zip (имя, род занятий)] ' –
@BhargavRao Я думаю, что это справедливое предположение, почему еще бы OP не показывал несоответствие в примере? –