Как объединить два списка на основе появления элемента списка одного из двух с использованием Python - PullRequest
3 голосов
/ 11 апреля 2019

У меня есть следующие списки

list1 = [[x1,1,b1],[x2,1,b1],[x3,1,b1],[x4,1,b1]]

и следующие

list2 = [[x1,0,b1],[x5,0,b1],[x2,0,b1],[x7,0,b1]]

Я не знаю, как создать окончательный список, такой как

list3 = [[x1,1,b1],[x2,1,b1],[x3,1,b1],[x4,1,b1],[x5,0,b1],[x7,0,b1]]

Сохранить первый список1 и добавить в список1 элементы из списка2 только если элемент list2 [0] [0] не существует в list1

Я пробовал что-то вроде следующего с несколькими комбинациями

for i in list1:
    for i2 in list2:
        if i[0][0] != i2[0][0]
            list3.append(i2)

Но list3 отображает общие элементы

Ответы [ 4 ]

5 голосов
/ 11 апреля 2019

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

Позвольте мне предложить более быструю и работающую альтернативу:

  • Извлечение первых элементов каждого list1 подсписка в set для быстрого соответствия.
  • Затем создайте новый список, добавив list1 и отфильтрованные элементы list2

Например:

list1 = [['x1',1,'b1'],['x2',1,'b1'],['x3',1,'b1'],['x4',1,'b1']]
list2 = [['x1',0,'b1'],['x5',0,'b1'],['x2',0,'b1'],['x7',0,'b1']]

list_items = {l[0] for l in list1}

list3 = list1 + [l for l in list2 if l[0] not in list_items]

Результат:

>>> list3
[['x1', 1, 'b1'],
 ['x2', 1, 'b1'],
 ['x3', 1, 'b1'],
 ['x4', 1, 'b1'],
 ['x5', 0, 'b1'],
 ['x7', 0, 'b1']]
0 голосов
/ 11 апреля 2019

Вы можете использовать словарь для объединения двух списков:

from itertools import chain

x1, x2, x3, x4, x5, x7 = 'x1', 'x2', 'x3', 'x4', 'x5', 'x7'
b1, b2, b3 = 'b1', 'b2', 'b3'

list1 = [[x1, 1, b1], [x2, 1, b1], [x3, 1, b1], [x4, 1, b1]]
list2 = [[x1, 0, b1], [x5, 0, b1], [x2, 0, b1], [x7, 0, b1]]

d = {i[0]: i for i in chain(list2, list1)}
sorted(d.values(), key=lambda x: x[0])
# [['x1', 1, 'b1'], ['x2', 1, 'b1'], ['x3', 1, 'b1'], ['x4', 1, 'b1'], ['x5', 0, 'b1'], ['x7', 0, 'b1']]
0 голосов
/ 11 апреля 2019

Вы должны использовать наборы и создать объединение, чтобы устранить дубликаты:

list1 = [[1,1,1], [1,1,2]]
list2 = [[1,1,3], [1,1,2]]

list1 = set([tuple(x) for x in list1])
list2 = set([tuple(x) for x in list2])

res = list1.union(list2)

это даст {(1, 1, 3), (1, 1, 1), (1, 1, 2)}

и иметь его в виде списка списков, которые вы можете сделать:[list(x) for x in res]

0 голосов
/ 11 апреля 2019

Добавьте списки вместе, поэтому

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