Orijinal listedeki kopyaları kaldırmadan iki listeyi birleştirmek ve kopyaları kaldırmak


115

İkinci listenin göz ardı edilen ilk listenin kopyalarının olduğu yerlerde birleştirmem gereken iki listem var. .. Açıklaması biraz zor, bu yüzden kodun neye benzediğine ve sonuç olarak ne istediğime dair bir örnek göstermeme izin verin.

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]

Sonuçta, iki "2" değeri de dahil olmak üzere ilk listenin bulunduğunu fark edeceksiniz , ancak second_list'in ayrıca ek bir 2 ve 5 değerine sahip olması ilk listeye eklenmedi.

Normalde böyle bir şey için kümeler kullanırdım, ancak first_list üzerindeki bir küme zaten sahip olduğu yinelenen değerleri temizlerdi. Bu yüzden, istenen bu kombinasyonu elde etmenin en iyi / en hızlı yolunun ne olduğunu merak ediyorum.

Teşekkürler.


3
Ya içinde üç tane 2 varsa second_list?
balpha

@balpha: Evet, bunu nasıl halletmek istediğime henüz tam olarak karar vermedim. Düşündüğüm bir şeydi ama bu konudaki kararsızlığım
yüzünden dışarıda bıraktım

Yanıtlar:


168

İlk listeye, ikinci listenin ilk - kümelerde bulunmayan öğelerini eklemeniz gerekir, bunların hangi öğe olduklarını belirlemenin en kolay yolu şudur:

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]

Veya tek gömlekleri tercih ederseniz 8-)

print(first_list + list(set(second_list) - set(first_list)))

2
Veya sıralamanız gerekiyorsa bu: ilk_listeyi yazdır + sıralı (set (second_list) - set (first_list))
hughdbrown

2
Liste (küme (ilk_list) | küme (ikinci_list)) # | kesişim ayarlandı bkz. stackoverflow.com/questions/4674013/…
staticd

1
@staticd: Evet ama bu yanlış cevabı veriyor. 2Sonuçlarınızda iki tane olması gereken tek bir tane var.
RichieHindle

ayy. Haklısın. Tamamen birinci liste olduğunu cevapsız edildi çiftleri izin verdi. : P
staticd

66
resulting_list = list(first_list)
resulting_list.extend(x for x in second_list if x not in resulting_list)

7
Sonunda setlere dönüştürmeyi içermeyen bir cevap! Kudos.
SuperFamousGuy

4
bu aslında O (n * m) ama hashable olmayan şeylerin bir listesine sahip olduğunuzda ve performans bir sorun olmadığında kullanışlı olabilir
alcuadrado

1
Ne birinci ne de ikinciden kopyalanmasını istemiyorum?
Dejell

Bu teknik, listedeki özniteliklerin sırasını korur, durum böyle değildir set. 👍
Subhash Bhushan

29

Setleri kullanabilirsiniz:

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]

Evet teşekkürler, anladım. Bu iyi çalışacak. resultList = first_list + list (set (second_list) -set (first_list))
Kathiravan Umaidurai

9

Numpy kullanıyorsanız, bunu tek bir kod satırına indirgeyebilirsiniz:

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]

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

print( set( first_list + second_list ) )

5
resulting_list = first_list + [i for i in second_list if i not in first_list]

1
first_list'i ayarlayın ve "hazırsınız"
u0b34a0f6ae

Ortaya çıkan liste sıralanmayacaktır.
avakar

1
Ya herhangi bir listenin hiç kopyası olmasını istemiyorsam? bu şekilde bir listede yinelenenler varsa geri dönecekler
Dejell

5

Benim için en basit olanı:

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]

1
Bu harika bir çözüm, ancak bir dizi sözlüğü bir dizi haline getirmeye çalışırsak işe yaramayacağını unutmayın, örneğin (yükseltecek TypeError: unhashable type: 'dict')
lakesare

2

RichieHindle'ın ve Ned Batchelder'ın yanıtlarını sıralamayı koruyan ortalama durum O (m + n) algoritması için de birleştirebilirsiniz:

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])

En x in skötü durum karmaşıklığı O (m) olduğundan , bu kodun en kötü durum karmaşıklığı hala O (m * n) 'dir .


0

Bu yardımcı olabilir

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

Birleştirme işlevi, ikinci listeyi birinci listeyle birleştirir, eğer zaten bir. Set union işlecine benzer. Bu fonksiyon değişmez b. Eğer a = [1,2,3] b = [2,3,4]. Birleşmeden sonra (a, b), a = [1,2,3,4] ve b = [2,3,4] yapar


0

Göre tarifi :

result_list = list (set (). union (birinci_list, ikinci_list))


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

    newList=[]
    for i in first_list:
        newList.append(i)
    for z in second_list:
        if z not in newList:
            newList.append(z)
    newList.sort()
    print newList

[1, 2, 2, 5, 7, 9]

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.