Похоже, что, несмотря на то, что имя файла xml является вашим источником, JSON, как упоминалось в другом ответе, генерировать словари из JSON может быть проще.
Если это невозможно, следующая программа будет работатьчерез ваши разные списки попробуйте получить идентификатор транзакции, который будет использоваться в качестве ключа для нашего основного defaultdict, который будет заполнен пустым dict, если идентификатор не существует, или добавьте новую запись в свой словарь в противном случае.
Вот полный код. Обратите внимание, что я изменил второй список, чтобы иметь идентификатор, соответствующий первому списку, чтобы показать, как поля из отдельных списков могут быть объединены в одном и том же тексте. Это предполагает отсутствие перекрытия между полями.
from collections import defaultdict
list1 = [['transaction_id', '224847627', 'product_amount', '2.73', 'user_invoice_date', '2018-12-21'],
['transaction_id', '67919397', 'product_amount', '2.73', 'user_invoice_date', '2017-10-26']]
# list2 = [['tracking_code', '29285908', 'from_country', 'FR', 'to_country', 'FR', 'package_type_id', '10', 'transaction_id', '172238850', 'shipping_label_created', '2018-09-25 18', '40', '52'],
list2 = [['tracking_code', '29285908', 'from_country', 'FR', 'to_country', 'FR', 'package_type_id', '10', 'transaction_id', '224847627', 'shipping_label_created', '2018-09-25 18', '40', '52'],
['tracking_code', '22105784', 'from_country', 'FR', 'to_country', 'FR', 'package_type_id', '10', 'transaction_id', '111423825', 'shipping_label_created', '2018-04-13 11', '22', '44']]
list3 = [['tracking_code', '21703238', 'from_country', 'FR', 'to_country', 'FR', 'amount', '3.23'],
['tracking_code', '41545695', 'from_country', 'FR', 'to_country', 'FR', 'amount', '2.9']]
def aggregate_lists(*lists):
transactions = defaultdict(dict)
for list in lists:
for row in list:
try:
id_col = row.index('transaction_id')
transaction_id = row[id_col + 1]
except ValueError:
continue # Better error handling to be added.
for col in range(0, len(row), 2):
if col != id_col:
transactions[transaction_id][row[col]] = row[col + 1]
return transactions
def main():
transactions = aggregate_lists(list1, list2, list3)
for k, props in transactions.items():
print(f'Transaction: {k}')
for k, v in props.items():
print(f'\t{k}: {v}')
if __name__ == '__main__':
main()
Вот этот вывод:
Transaction: 224847627
product_amount: 2.73
user_invoice_date: 2018-12-21
tracking_code: 29285908
from_country: FR
to_country: FR
package_type_id: 10
shipping_label_created: 2018-09-25 18
40: 52
Transaction: 67919397
product_amount: 2.73
user_invoice_date: 2017-10-26
Transaction: 111423825
tracking_code: 22105784
from_country: FR
to_country: FR
package_type_id: 10
shipping_label_created: 2018-04-13 11
22: 44
Я только что понял, что list3 не имеет идентификатора транзакции, который поэтому игнорируется. В любом случае, это должно дать идею.