Объединение двух списков и удаление дубликатов, без удаления дубликатов в исходном списке - PullRequest
80 голосов
/ 23 августа 2009

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

first_list = [1, 2, 2, 5]

second_list = [2, 5, 7, 9]

# The result of combining the two lists should result in this list:
resulting_list = [1, 2, 2, 5, 7, 9]

Вы заметите, что у результата есть первый список, включая его два значения "2", но тот факт, что second_list также имеет дополнительные значения 2 и 5, не добавляется в первый список.

Обычно для чего-то подобного я использовал бы наборы, но набор first_list удалял бы дублирующиеся значения, которые у него уже есть. Так что мне просто интересно, как лучше / быстрее всего достичь этой желаемой комбинации.

Спасибо.

Ответы [ 12 ]

132 голосов
/ 23 августа 2009

Вам необходимо добавить в первый список те элементы второго списка, которых нет в первом - наборы - это самый простой способ определить, какими они являются элементами, например:

first_list = [1, 2, 2, 5]
second_list = [2, 5, 7, 9]

in_first = set(first_list)
in_second = set(second_list)

in_second_but_not_in_first = in_second - in_first

result = first_list + list(in_second_but_not_in_first)
print result  # Prints [1, 2, 2, 5, 9, 7]

Или, если вы предпочитаете однострочник 8 -)

print first_list + list(set(second_list) - set(first_list))
46 голосов
/ 23 августа 2009
resulting_list = list(first_list)
resulting_list.extend(x for x in second_list if x not in resulting_list)
17 голосов
/ 12 февраля 2013

Вы можете использовать наборы:

first_list = [1, 2, 2, 5]
second_list = [2, 5, 7, 9]

resultList= list(set(first_list) | set(second_list))

print(resultList)
# Results in : resultList = [1,2,5,7,9]
6 голосов
/ 02 декабря 2017
first_list = [1, 2, 2, 5]
second_list = [2, 5, 7, 9]

print( set( first_list + second_list ) )
5 голосов
/ 15 июня 2018

Вы можете свести это к одной строке кода, если используете numpy:

a = [1,2,3,4,5,6,7]
b = [2,4,7,8,9,10,11,12]

sorted(np.unique(a+b))

>>> [1,2,3,4,5,6,7,8,9,10,11,12]
4 голосов
/ 11 мая 2018

Самый простой для меня это:

first_list = [1, 2, 2, 5]
second_list = [2, 5, 7, 9]

merged_list = list(set(first_list+second_list))
print(merged_list)

#prints [1, 2, 5, 7, 9]
4 голосов
/ 23 августа 2009
resulting_list = first_list + [i for i in second_list if i not in first_list]
2 голосов
/ 16 сентября 2018

На основе рецепта :

result_list = list (set (). Union (first_list, second_list))

2 голосов
/ 12 сентября 2012

Это может помочь

def union(a,b):
    for e in b:
        if e not in a:
            a.append(e)

Функция объединения объединяет второй список с первым без дублирования элемента a, если он уже есть в. Похоже на оператор объединения. Эта функция не изменяется b. Если a = [1,2,3] b = [2,3,4]. После объединения (a, b) a = [1,2,3,4] и b = [2,3,4]

1 голос
/ 19 ноября 2015

Вы также можете комбинировать ответы RichieHindle и Ned Batchelder для среднего случая O (m + n) алгоритма, который сохраняет порядок:

first_list = [1, 2, 2, 5]
second_list = [2, 5, 7, 9]

fs = set(first_list)
resulting_list = first_list + [x for x in second_list if x not in fs]

assert(resulting_list == [1, 2, 2, 5, 7, 9])

Обратите внимание, что x in s имеет сложность в худшем случае O (м) , поэтому сложность этого кода в худшем случае все еще О (т * п) .

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