У меня есть два списка кортежей, которые мне нужно объединить. Это будет сопоставимо с JOIN в терминах базы данных. Порядок кортежей в каждом списке может измениться. Порядок элементов в кортеже не изменится. Количество элементов в A должно равняться счету в B, но может быть разница.Как слить два списка кортежей на основе ключа?
Вот мои два списка кортежей. В каждом списке будет 10 000 + этих кортежей, поэтому производительность вызывает беспокойство. Первый элемент в каждом кортеже является ключевым для каждого списка.
listA = [(u'123', u'a1', u'a2', 123, 789), (u'124', u'b1', u'b2', 456, 357), (u'125', u'c1', u'c2', 156, 852)]
listB = [(u'125', u'd1', u'N', u'd2', 1), (u'123', u'f1', u'Y', u'f2', 2)]
Нужный выход:
listC = [(u'123', u'a1', u'a2', 123, 789, u'f1', u'Y', u'f2', 2), (u'125', u'c1', u'c2', 156, 852, u'd1', u'N', u'd2', 1)]
Вот код, который я бросил вместе для тестирования концепции. Он работает, но, как вы видите, производительность - это проблема. Производительность этого кода при работе с реальными данными (10 тыс. Элементов в каждом списке) неприемлема, так как потребуется, возможно, часов для завершения.
Вот код:
for row in listA:
for item in listB:
if item[0] == row[0]:
item = list(item)
del item[0]
row = list(row)
merged.append(tuple(row + item))
Как объединить/объединить два списка и достижения более высокой производительности?
Посмотрите на 'itertools.groupby' используя' lambda'. * Отказ от ответственности, список должен быть отсортирован первым. – CoryKramer
Почему бы не использовать какую-либо другую структуру данных, такую как 'dict of list' – luoluo
Конечные результаты должны быть списком кортежей, потому что это то, что требует целевое приложение. – DenaliHardtail