Python объединить два списка с первым общим индексом - PullRequest
0 голосов
/ 17 января 2020

У меня есть два списка python со следующими данными

list1 = [[datetime.date(2019, 12, 11), 4], [datetime.date(2019, 12, 14), 3]]
list2 = [[datetime.date(2019, 12, 14), 2], [datetime.date(2019, 12, 16), 9]]

Я должен объединить оба списка с первым полем индекса ie., datetime.date, чтобы они были общими. Кроме того, если первый индекс не совпадает для обоих, установите значение.

Также, если какой-либо из списков пуст, установите соответствующую позицию равной 0.

Результирующим будет

list_new = [
   [datetime.date(2019, 12, 11), 4, 0],
   [datetime.date(2019, 12, 14), 3, 2],
   [datetime.date(2019, 12, 16), 0, 9]
]

Я пытался использовать zip как

new_list = [a + [b[1]] for (a, b) in zip(list1, list2)]

Но, похоже, это не работает.

Ответы [ 4 ]

2 голосов
/ 17 января 2020

Простой (неоптимальный) однострочный:

[[element, dict(list1).get(element, 0), dict(list2).get(element, 0)] for element in set([l[0] for l in list1 + list2])]

Объяснение:

  1. Получить набор уникальных первых элементов из списка:
>>> s = set([l[0] for l in list1 + list2])
>>> s
set([datetime.date(2019, 12, 11), datetime.date(2019, 12, 14), datetime.date(2019, 12, 16)])
Преобразование списка двух элементов в dict:
>>> d1 = dict(list1)
>>> d1
{datetime.date(2019, 12, 11): 4, datetime.date(2019, 12, 14): 3}
>>> d2 = dict(list2)
>>> d2
{datetime.date(2019, 12, 14): 2, datetime.date(2019, 12, 16): 9}

Наконец, сформируйте результирующий список:
>>> [[element] + [d1.get(element, 0)] + [d2.get(element, 0)] for element in s]
[[datetime.date(2019, 12, 11), 4, 0], [datetime.date(2019, 12, 14), 3, 2], [datetime.date(2019, 12, 16), 0, 9]]

1 голос
/ 17 января 2020
  1. Преобразование двух списков списков в диктовку:

    dict1 = dict (list1) dict2 = dict (list2)

  2. Сформируйте новый список следующим образом:

    new_list = [[a, b, dict2.get (a, 0)] для a, b в dict1.iteritems ()] + [[ a, 0, b] для a, b в dict2.iteritems (), если a не в dict1]

1 голос
/ 17 января 2020

Это объединение list1 и list2 с использованием heapq.merge (при условии, что даты отсортированы в каждом списке и в каждом списке нет повторяющихся дат):

import datetime
from heapq import merge
from pprint import pprint

list1 = [[datetime.date(2019, 12, 11), 4], [datetime.date(2019, 12, 14), 3]]
list2 = [[datetime.date(2019, 12, 14), 2], [datetime.date(2019, 12, 16), 9]]

i1 = ((1, v) for v in list1)
i2 = ((2, v) for v in list2)

d = {}
for v in merge(i1, i2, key=lambda k: k[1]):
    d.setdefault(v[1][0], {})[v[0]] = v[1][1]

out = []
for k, v in d.items():
    out.append((k, *[v.get(i, 0) for i in range(1, 3)]))

pprint(out)

Печать:

[(datetime.date(2019, 12, 11), 4, 0),
 (datetime.date(2019, 12, 14), 3, 2),
 (datetime.date(2019, 12, 16), 0, 9)]
0 голосов
/ 17 января 2020

Можете ли вы быть более понятным о том, что вы пытаетесь сделать?

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

В вашем примере:

list_new = [
   [datetime.date(2019, 12, 11), 4, 0],
   [datetime.date(2019, 12, 14), 3, 2],
   [datetime.date(2019, 12, 16), 0, 9]
]

Что соответствует 4,0 3,2 0,9 в этих записях?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...