Soru Python'da iki liste nasıl birleştirilir?


Python'da iki listeyi nasıl birleştiririm?

Örnek:

listone = [1, 2, 3]
listtwo = [4, 5, 6]

Beklenen sonuç:

>>> joinedlist
[1, 2, 3, 4, 5, 6]

1643
2017-11-12 07:04


Menşei


listone olsaydı ne olacak [3,2,1]? Çıkış değişecek mi? - barkmadley
"bir sığ kopya oluşturma", "derin kopya" veya "tekrardan" oluşturma gibi 'birleştirin'? (@Clergyman, o kadar da önemsiz değil) - smci
Bu operasyon denilmiyor concatination ziyade birleştirme? Ben her zaman birleştirme düşüncesinin concatination + sorting olduğunu düşündüm. - Lenar Hoyt
Sadece yapmak istermisin eklemekya da ister misin iki listeyi sıralanmış sırayla birleştir? [1,3,6] ve [2,4,5] için hangi çıktıyı bekliyorsunuz? Her iki alt listenin de (örneğinizde olduğu gibi) zaten sıralanmış olduğunu varsayabilir miyiz? - smci
@LenarHoyt Doğru. Birleşme, en azından bir çeşit keyfi veya ilişkisel sıralama anlamına gelir. - Benjamin R


Cevaplar:


Kullanabilirsiniz + operatör bunları birleştirmek için:

listone = [1,2,3]
listtwo = [4,5,6]

mergedlist = listone + listtwo

Çıktı:

>>> mergedlist
[1,2,3,4,5,6]

2704
2017-11-12 07:07



Bu listone derin bir kopyasını oluşturur ve listtwo ekler? - Daniel F
@Daniel, listenin birinci listesindeki sığ bir kopyasını içeren yeni bir liste oluşturacak, ardından ikinci listede bulunan eşyaların sığ bir kopyası olacaktır. Listelerin derin kopyalarını almak için copy.deepcopy kullanın. - Daniel G
Burada başka bir yararlı detay: listone += listtwo sonuç listone == [1, 2, 3, 4, 5, 6] - rickcnagy
@ br1ckb0t, listone'un işaret ettiği şeyi değiştirecek mi? Yani:list3 = listone  listone+=listtwo       Liste3 de değişti mi? - MikeH
list3 değiştirir. Ancak, bu bir sorun değilse, yeni bir liste oluşturmak yerine iki listeyi eklemek daha kolay okunabilir. - rickcnagy


Her iki listede de sadece öğeler üzerinde yineleyen bir jeneratör oluşturmak mümkündür. Bu, öğeleri yeni bir listeye kopyalamaksızın işlemek için zincir listelerini (veya yinelenebilir) birlikte oluşturmanızı sağlar:

import itertools
for item in itertools.chain(listone, listtwo):
   # do something with each list item

215
2017-11-12 20:01



Bu daha iyi bir yoldur, çünkü aynı zamanda numpy dizisiyle çalışır. - d.putto
Bu aynı şekilde çalışır: mergedList = birleştirilmiş öğe için itertools.chain (listone, listtwo): - zakdances
@ d.putto: tek tek öğe erişimi, numpy dizileri için çok yavaştır (her erişim ham belleği bir C tipi ile Python nesnesine dönüştürmek için gerektirir. np.dot() C tipi çalışmalarda Python'a gidiş-dönüş olmadan ve bu nedenle hızlı bir şekilde çalışın. Kullanabilirsin merged = np.r_[a, b] Birleştirilmiş numpy dizisi almak için. - jfs


Birleştirilmiş değerler listesi elde etmek için setler kullanabilirsiniz.

mergedlist = list(set(listone + listtwo))

151
2017-09-20 08:43



Bu, sipariş bilgilerini kaybedecek. - aaronasterling
Doğru, ancak, aynı zamanda ilginizi çekiyorsa, çiftleri de kaldıracaktır. Liste eki bunu yapmazdı. - metasoarous
Daha iyi listone + [x for x in listtwo if x not in listone] - Natim
Bu gibi bir liste listesi olsaydı: [[0, 5], [1, 10], [0, 7], [3, 5]]  Anahtardaki kopyalardan (her alt listedeki ilk değer) kaçınmak için onları nasıl birleştirirsiniz, ancak yineleniyorlarsa ikinci değerlerin toplamı ile sonuçlanırlar. Öyle: [[0, 12], [1, 10], [3, 5]]  Teşekkürler - Jose Salvatierra
+1 IMHO bu "birleştirme" (sendika) listelerinin doğru yoludur, "onaylanmış" cevabın nasıl birleştirileceğini / eklendiğini listeler (multiset) - alfasin


Ayrıca kullanabilirsiniz extend eklemek için list diğerinin sonuna ekle:

listone = [1,2,3]
listtwo = [4,5,6]
mergedlist = []
mergedlist.extend(listone)
mergedlist.extend(listtwo)

100
2018-02-25 15:13



Sadece listone.extend (listtwo) kullanabilirsiniz ama yakında kullanımdan kaldırılacak - Sergey Ivanov
@SergeyIvanov hayır olmaz. list.extend hiçbir yere gitmiyor. - Jim Fasarakis Hilliard


piton >= 3.5 alternatif: [*l1, *l2]

Bu eski bir cevap olsa da, kabulü ile başka bir alternatif kabul edildi. PEP 448 bahseden hak ediyor.

PEP, başlıklı Ek Paket Açma Genelleştirmeleri, genellikle yıldız işaretini kullanırken bazı sözdizimsel kısıtlamaları azalttı * Python'da ifade; Bununla birlikte, iki listeye katılarak (yinelenen herhangi bir uygulamaya uygulanır) artık aşağıdakilerle de yapılabilir:

>>> l1 = [1, 2, 3]
>>> l2 = [4, 5, 6]

#unpack both iterables in a list literal
>>> joinedList = [*l1, *l2]
>>> print(joinedList)
[1, 2, 3, 4, 5, 6]

Bu işlevsellik Python için tanımlandı 3.5 önceki sürümlerine geri yüklenmedi 3.x aile. Desteklenmeyen sürümlerde SyntaxError yükseltilecek.

Diğer yaklaşımlarda olduğu gibi, bu da sığ kopya olarak oluşturur İlgili listelerdeki elemanların


üst taraf Bu yaklaşıma göre bunu gerçekleştirmek için gerçekten listelere ihtiyacınız yok, yinelenebilecek her şey yapacak. PEP'de belirtildiği gibi:

Bu, yinelenenlerin bir araya toplanmasının daha okunabilir bir yolu olarak da yararlıdır.   gibi liste my_list + list(my_tuple) + list(my_range) şimdi olan   sadece eşdeğer [*my_list, *my_tuple, *my_range].

Yani ile eklerken + bir yükseltmek TypeError tür uyuşmazlığı nedeniyle:

l = [1, 2, 3]
r = range(4, 7)
res = l + r

Aşağıdakiler olmaz:

res = [*l, *r]

çünkü önce iterables içeriğini açacak ve sonra sadece bir list içerikten.


97
2017-11-12 07:07



bu:lst = [1,2,3,*[4,5,6]] dedim Expected:] - Mahesha999
@ Mahesha999 bunu doğrulayamıyor gibi görünüyor, benim için beklendiği gibi çalışıyor. - Jim Fasarakis Hilliard


Bu oldukça basit, bence bile öğretici:

>>> listone = [1,2,3]
>>> listtwo = [4,5,6]
>>>
>>> listone + listtwo
[1, 2, 3, 4, 5, 6]

57
2018-03-05 09:15



Ve bu da çalışır listone ve listtwo farklı sayıda eleman var ;-) - albus_c


Sadece kullanabilirsiniz + veya += operatör aşağıdaki gibi:

a = [1, 2, 3]
b = [4, 5, 6]

c = a + b

Veya:

c = []
a = [1, 2, 3]
b = [4, 5, 6]

c += (a + b)

Ayrıca, birleştirilmiş listedeki değerlerin benzersiz olmasını istiyorsanız şunları yapabilirsiniz:

c = list(set(a + b))

33
2017-10-09 23:21





Bu soru, doğrudan iki listeye katılmayı sorar. Bununla birlikte, birçok listeye (sıfır listelerine katıldığınızda da dahil olmak üzere) katılmanın bir yolunu ararken bile aramada oldukça yüksektir. Bu daha genel yaklaşım düşünün:

a = [[1,2,3], [4,5,6], [7,8,9]]
reduce(lambda c, x: c + x, a, [])

Çıkış olacak:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

Not, bu aynı zamanda doğru çalışır a olduğu [] veya [[1,2,3]].

Ancak, bu daha verimli bir şekilde yapılabilir itertools:

a = [[1,2,3], [4,5,6], [7,8,9]]
list(itertools.chain(*a))

Eğer ihtiyacınız yoksa list, ama sadece yinelenebilir, ihmal et list().

Güncelleştirme

Yorumlarda Patrick Collins tarafından önerilen alternatif de sizin için işe yarayabilir:

sum(a, [])

29
2018-02-05 05:01



sum(a,[]) sadece "a" bir liste listesi olduğunda çalışır. - Procyclinsur
Python 3 notu: reduce şimdi functools bu yüzden önce onu içe aktarmanız gerekecek. - Jim Fasarakis Hilliard


Bu dikkat itertools.chain işlev değişken sayıda bağımsız değişken kabul eder:

>>> l1 = ['a']; l2 = ['b', 'c']; l3 = ['d', 'e', 'f']
>>> [i for i in itertools.chain(l1, l2)]
['a', 'b', 'c']
>>> [i for i in itertools.chain(l1, l2, l3)]
['a', 'b', 'c', 'd', 'e', 'f']

Bir yinelenebilir (tuple, liste, jeneratör, vb.) Girişse, from_iterable sınıf metodu kullanılabilir:

>>> il = [['a'], ['b', 'c'], ['d', 'e', 'f']]
>>> [i for i in itertools.chain.from_iterable(il)]
['a', 'b', 'c', 'd', 'e', 'f']

20
2017-07-21 00:53





Python 3.3+ ile kullanabilirsiniz verim:

listone = [1,2,3]
listtwo = [4,5,6]

def merge(l1, l2):
    yield from l1
    yield from l2

>>> list(merge(listone, listtwo))
[1, 2, 3, 4, 5, 6]

Ya da, rasgele sayıdaki yinelemeyi desteklemek istiyorsanız:

def merge(*iters):
    for it in iters:
        yield from it

>>> list(merge(listone, listtwo, 'abcd', [20, 21, 22]))
[1, 2, 3, 4, 5, 6, 'a', 'b', 'c', 'd', 20, 21, 22]

19
2017-07-07 13:30





İki listeyi sıralanmış biçimde birleştirmek isterseniz, heapq kütüphanesinden birleştirme işlevini kullanabilirsiniz.

from heapq import merge

a = [1,2,4]
b = [2,4,6,7]

print list(merge(a,b))

14
2018-02-20 21:05



Not, bu varsayar ki a ve b zaten sıralanmış - Chris_Rands