Python'da iki listeyi nas─▒l birle┼čtiririm?


Al─▒nan cevaba git


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]
 

2205





2009-11-12




Cevap say─▒s─▒n─▒ say: 26






+ Onlar─▒ birle┼čtirmek i├žin operat├Âr├╝ kullanabilirsiniz :

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

joinedlist = listone + listtwo
 

Çıktı:

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

3471







Her iki listedeki ├Â─čeler ├╝zerinde basit├že yinelenen bir jenerat├Âr olu┼čturmak da m├╝mk├╝nd├╝r. Bu, ├Â─čeleri yeni bir listeye kopyalamadan i┼člemek i├žin listeleri (veya yinelenebilir olanlar─▒) birlikte zincirlemenizi sa─člar:

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

278







Birle┼čtirilmi┼č benzersiz de─čerlerin listesini elde etmek i├žin k├╝meleri kullanabilirsiniz.

 mergedlist = list(set(listone + listtwo))
 

197







Python >= 3.5 alternatifi: [*l1, *l2]

Bu eski bir cevap olsa da, PEP 448 bahsetmeyi hak etti─čini kabullenerek ba┼čka bir alternatif daha ortaya kondu.

Ek Paketi A├žma Genelle┼čtirmeleri ba┼čl─▒kl─▒ PEP, * Python'da y─▒ld─▒zl─▒ ifadeyi kullan─▒rken genellikle baz─▒ s├Âzdizimsel k─▒s─▒tlamalar─▒ azaltm─▒┼čt─▒r ; Bununla beraber, iki listeye kat─▒lmak (herhangi bir yinelemeye uygulanabilir) de ┼ču ┼čekilde 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┼člev , Python 3.5 i├žin tan─▒mlanm─▒┼č ve 3.x ailenin ├Ânceki s├╝r├╝mlerinde desteklenmiyor . Desteklenmeyen s├╝r├╝mlerde a SyntaxError y├╝kseltilecektir.

Di─čer yakla┼č─▒mlarda oldu─ču gibi, bu da kar┼č─▒l─▒k gelen listelerdeki ├Â─čelerin s─▒─č kopyas─▒ olarak yarat─▒l─▒r .


Ters Bu yakla┼č─▒ma Ger├žekten ger├žekle┼čtirmek i├žin, iterable yapacak olan hi├žbir ┼čeye gerek listeleri yapmak olmas─▒d─▒r. KEP'de belirtildi─či gibi:

Bu ayn─▒ zamanda, yinelemeleri my_list + list(my_tuple) + list(my_range) art─▒k sadece e┼čde─čer olan bir listeye toplaman─▒n daha okunakl─▒ bir yolu olarak kullan─▒┼čl─▒d─▒r [*my_list, *my_tuple, *my_range] .

─░le ilave s├╝re Yani + bir g├╝ndeme getirece─čini TypeError uyu┼čmazl─▒─č─▒ yaz─▒n dolay─▒:

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

A┼ča─č─▒daki olmaz:

 res = [*l, *r]
 

├ž├╝nk├╝ ilk ├Ânce yineleyicilerin i├žeri─čini a├žacak ve daha sonra basit├že bir list i├žerik olu┼čturacakt─▒r .


194







Ba┼čka birinin sonuna extend eklemek i├žin de kullanabilirsiniz list :

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

155







Bu olduk├ža basit ve bence ├Â─čreticide de g├Âsterildi :

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

72







Bu soru do─črudan iki listeye kat─▒lmay─▒ sorar. Bununla birlikte, bir├žok listeye kat─▒lman─▒n bir yolunu ararken bile (s─▒f─▒r listeye kat─▒ld─▒─č─▒n─▒zda da dahil), aramada olduk├ža y├╝ksektir.

Bence en iyi se├ženek liste anlamalar─▒n─▒ kullanmak:

 >>> a = [[1,2,3], [4,5,6], [7,8,9]]
>>> [x for xs in a for x in xs]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
 

Jenerat├Ârler de olu┼čturabilirsiniz:

 >>> map(str, (x for xs in a for x in xs))
['1', '2', '3', '4', '5', '6', '7', '8', '9']
 

Eski cevap

Bu daha genel bir yakla┼č─▒m d├╝┼č├╝n├╝n:

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

Çıkacak:

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

Bu da d├╝zg├╝n ├žal─▒┼č─▒r, Not 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))
 

─░htiyac─▒n─▒z yoksa list , sadece tekrar edilebilir bir ┼čey varsa, atlay─▒n list() .

G├╝ncelle┼čtirme

Yorumlarda Patrick Collins taraf─▒ndan ├Ânerilen alternatif sizin i├žin de i┼če yarayabilir:

 sum(a, [])
 

50







+ Veya += operat├Âr├╝ a┼ča─č─▒daki gibi kullanabilirsiniz :

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

40







Python'da iki listeyi nas─▒l birle┼čtiririm?

3.7'den itibaren, bunlar python'da iki (veya daha fazla) listeyi birle┼čtirmek i├žin en pop├╝ler stdlib metodlar─▒d─▒r.


g├Âr├╝nt├╝ tan─▒m─▒n─▒ buraya girin

Dipnotlar

  1. Bu ├Âzl├╝ olmas─▒ nedeniyle kaygan bir ├ž├Âz├╝md├╝r. Ancak sum birle┼čtirme i┼člemini ikili bir ┼čekilde ger├žekle┼čtirir; bu, her ad─▒m i├žin belle─čin ayr─▒lmas─▒ gerekti─či i├žin bunun ikinci dereceden bir i┼člem oldu─ču anlam─▒na gelir. Listeleriniz b├╝y├╝kse KULLANMAYIN.

  2. Dok├╝manlara bak─▒n chain ve bak─▒n chain.from_iterable . import itertools ─░lk ├Ânce ihtiyac─▒n─▒z olacak . Birle┼čtirme bellekte do─črusald─▒r, bu nedenle performans ve s├╝r├╝m uyumlulu─ču a├ž─▒s─▒ndan en iyisi budur. chain.from_iterable 2.6 y─▒l─▒nda tan─▒t─▒ld─▒.

  3. Bu y├Ântem, Ek Paket A├žma Genelle┼čtirmeleri (PEP 448) kullan─▒r , ancak her birini kendiniz el ile paketten ├ž─▒karmad─▒─č─▒n─▒z s├╝rece N listelerine genelleyemezsiniz.

  4. a += b ve a.extend(b) t├╝m pratik ama├žlar i├žin a┼ča─č─▒ yukar─▒ e┼čde─čerdir. += Bir listeye ├ža─čr─▒ld─▒─č─▒nda list.__iadd__ , ilk listeyi ikinciye geni┼čleten dahili olarak arama yap─▒l─▒r .


performans

2 Liste Birle┼čtirme 1


g├Âr├╝nt├╝ tan─▒m─▒n─▒ buraya girin

N Listesi Birle┼čtirmesi


g├Âr├╝nt├╝ tan─▒m─▒n─▒ buraya girin

Perfplot mod├╝l├╝ kullan─▒larak grafikler olu┼čturulmu┼čtur . Referans i├žin kod.

1. iadd ( += ) ve extend metodlar─▒ yerinde ├žal─▒┼č─▒r, bu nedenle testten ├Ânce her seferinde bir kopya olu┼čturulmal─▒d─▒r. ─░┼čleri adil tutmak i├žin, t├╝m y├Ântemlerin sol taraftaki liste i├žin g├Âz ard─▒ edilebilecek bir ├Ân kopyalama ad─▒m─▒ vard─▒r.


Di─čer ├ç├Âz├╝mler ├ťzerine Yorumlar

  • DUNDER Y├ľNTEM─░N─░ list.__add__ do─črudan, hi├žbir ┼čekilde, bi├žimde veya bi├žimde KULLANMAYIN . Asl─▒nda, g├Âk g├╝r├╝lt├╝s├╝ y├Ântemlerinden uzak durun ve i┼čle├žleri ve operator tasarland─▒klar─▒ gibi i┼člevleri kullan─▒n . Python, sadece i├žine do─črudan dunder ├ža─č─▒rmaktan daha karma┼č─▒k olan, bunlara eklenmi┼č ├Âzenli bir semanti─či var. ─░┼čte bir ├Ârnek . Yani, ├Âzetlemek gerekirse, a.__add__(b) => BAD; a + b => ─░Y─░.

  • Buradaki baz─▒ cevaplar reduce(operator.add, [a, b]) ├žift ÔÇőÔÇőbiti┼čtirme i├žin sunar - bu sum([a, b], []) sadece daha fazla wordy ile ayn─▒d─▒r .

  • Kullan─▒lan herhangi bir y├Ântem set kopyalar─▒ d├╝┼č├╝r├╝r ve s─▒ras─▒n─▒ kaybeder. Dikkatle kullan─▒n.

  • for i in b: a.append(i) a.extend(b) tek i┼člev ├ža─čr─▒s─▒ ve daha deyimsel olandan daha endi┼če verici ve yava┼čt─▒r . append listeler i├žin belle─čin ayr─▒ld─▒─č─▒ ve b├╝y├╝t├╝ld├╝─č├╝ anlambilim nedeniyle daha yava┼čt─▒r. Benzer bir tart─▒┼čma i├žin buraya bak─▒n─▒z .

  • heapq.merge ├žal─▒┼čacak, ancak kullan─▒m durumu s─▒ralanm─▒┼č listeleri do─črusal zamanda birle┼čtirmek i├žindir. Ba┼čka bir durumda kullanmak bir anti-paterndir.

  • yield Bir fonksiyondan liste elemanlar─▒n─▒n yerle┼čtirilmesi kabul edilebilir bir y├Ântemdir, ancak chain bunu daha h─▒zl─▒ ve daha iyi yapar (C'de bir kod yoluna sahiptir, bu y├╝zden h─▒zl─▒d─▒r).

  • operator.add(a, b) kabul edilebilir bir i┼člevsel e┼čde─čerdir a + b . Kullan─▒m durumlar─▒ temelde dinamik y├Ântem g├Ânderimi i├žindir. Aksi takdirde, bence a + b , daha k─▒sa ve daha okunakl─▒ olan─▒ tercih edin . YMMV.


32


2019-06-01





itertools.chain Fonksiyonun de─či┼čken say─▒da arg├╝man kabul etti─čini belirtmekte fayda var :

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

Giri┼č yinelenebilirse (demet, liste, jenerat├Âr vb.) Girdi ise, from_iterable s─▒n─▒f y├Ântemi kullan─▒labilir:

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

26







Python 3.3+ ile verimi a┼ča─č─▒dakilerden kullanabilirsiniz :

 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]
 

Veya rasgele say─▒da yineleyiciyi 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]
 

22


2014-07-21





─░ki listeyi s─▒ral─▒ bi├žimde birle┼čtirmek istiyorsan─▒z, merge i┼člevi heapq k├╝t├╝phaneden kullanabilirsiniz.

 from heapq import merge

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

print list(merge(a, b))
 

18







Plus operat├Âr├╝n├╝ ( + ) kullanam─▒yorsan─▒z, operator i├že aktarmay─▒ kullanabilirsiniz :

 import operator

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

result = operator.add(listone, listtwo)
print(result)

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

Alternatif olarak, __add__ dunder i┼člevini de kullanabilirsiniz :

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

result = list.__add__(listone, listtwo)
print(result)

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

14







Daha fazla liste i├žin daha genel bir yol olarak, bunlar─▒ bir listeye koyabilir ve i├ž i├že ge├žmi┼č bir listeyi d├╝zle┼čtirmek i├žin bu cevab─▒ temel alan itertools.chain.from_iterable() 1 i┼člevi kullanabilirsiniz :

 >>> l=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> import itertools
>>> list(itertools.chain.from_iterable(l))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
 

1. chain.from_iterable() Python 2.6 ve sonras─▒nda mevcuttur. Di─čer s├╝r├╝mlerde, kullan─▒n chain(*l) .


13







─░ki s─▒ral─▒ listeyi karma┼č─▒k s─▒ralama kurallar─▒yla birle┼čtirmeniz gerekiyorsa, a┼ča─č─▒daki kodda oldu─ču gibi kendiniz d├Ând├╝rmeniz gerekebilir (okunabilirlik i├žin basit bir s─▒ralama kural─▒ kullanarak :-)).

 list1 = [1,2,5]
list2 = [2,3,4]
newlist = []

while list1 and list2:
    if list1[0] == list2[0]:
        newlist.append(list1.pop(0))
        list2.pop(0)
    elif list1[0] < list2[0]:
        newlist.append(list1.pop(0))
    else:
        newlist.append(list2.pop(0))

if list1:
    newlist.extend(list1)
if list2:
    newlist.extend(list2)

assert(newlist == [1, 2, 3, 4, 5])
 

10







Nesnelerde append() tan─▒mlanan y├Ântemi kullanabilirsiniz list :

 mergedlist =[]
for elem in listone:
    mergedlist.append(elem)
for elem in listtwo:
    mergedlist.append(elem)
 

7







 list(set(listone) | set(listtwo))
 

Yukar─▒daki kod sipari┼či korumaz, her listeden yinelenenleri kald─▒r─▒r (birle┼čtirilmi┼č listeden de─čil)


7







Daha ├Ânce de belirtildi─či gibi, her iki listeye de ayn─▒ tedaviyi itertools.chain() uygulamak gerekiyorsa yap─▒lmas─▒ gereken yoldur . Benim durumumda, bir listeden di─čerine farkl─▒ bir etiket ve bayrak vard─▒, bu y├╝zden biraz daha karma┼č─▒k bir ┼čeye ihtiyac─▒m vard─▒. G├Âr├╝n├╝┼če g├Âre, sahne arkas─▒nda basit├že a┼ča─č─▒dakileri yapar: itertools.chain()

 for it in iterables:
    for element in it:
        yield element
 

(bkz. https://docs.python.org/2/library/itertools.html ), bu y├╝zden buradan ilham ald─▒m ve bu sat─▒rlar boyunca bir ┼čeyler yazd─▒m:

 for iterable, header, flag in ( (newList, 'New', ''), (modList, 'Modified', '-f')):
    print header + ':'
    for path in iterable:
        [...]
        command = 'cp -r' if os.path.isdir(srcPath) else 'cp'
        print >> SCRIPT , command, flag, srcPath, mergedDirPath
        [...]
 

Burada anla┼č─▒lmas─▒ gereken ana noktalar, listelerin, di─čerleri gibi nesneler olan, sadece ├Âzel bir yinelenebilir durum oldu─ču; ve for ... in python i├žindeki bu d├Âng├╝ler tuple de─či┼čkenleriyle ├žal─▒┼čabilir, bu nedenle ayn─▒ anda birden fazla de─či┼čkende d├Âng├╝ yapmak basittir.


6







Basit bir liste kavrama kullan─▒n:

 joined_list = [item for list_ in [list_one, list_two] for item in list_]
 

Ek Paketi A├žma Genelle┼čtirmeleri'ni kullanman─▒n en yeni yakla┼č─▒m─▒n─▒n t├╝m avantajlar─▒na sahiptir - yani, rasgele say─▒da farkl─▒ yinelemeleri (├Ârne─čin listeler, tuples, aral─▒klar ve jenerat├Ârler) bu ┼čekilde bir araya getirebilirsiniz - ve Python 3.5 veya ├╝st├╝ ile s─▒n─▒rl─▒ de─čildir .


5


2018-06-04





Bir liste listesini birle┼čtirmek i├žin ger├žekten ├Âzl├╝ bir yol

 list_of_lists = [[1,2,3], [4,5,6], [7,8,9]]
reduce(list.__add__, list_of_lists)
 

bu bize verir

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

4







Python'da, bu boyutta uyumlu boyutlardaki iki diziyi birle┼čtirebilirsiniz.

 numpy.concatenate([a,b])
 

4







Yani iki kolay yol var.

  1. Kullan─▒m─▒ + : Verilen listelerden yeni bir liste olu┼čturur

├ľrnek:

 In [1]: a = [1, 2, 3]

In [2]: b = [4, 5, 6]

In [3]: a + b
Out[3]: [1, 2, 3, 4, 5, 6]

In [4]: %timeit a + b
10000000 loops, best of 3: 126 ns per loop
 
  1. Extend kullanma : Mevcut listeye yeni liste ekler. Bu, ayr─▒ bir liste olu┼čturmad─▒─č─▒ anlam─▒na gelir.

├ľrnek:

 In [1]: a = [1, 2, 3]

In [2]: b = [4, 5, 6]

In [3]: %timeit a.extend(b)
10000000 loops, best of 3: 91.1 ns per loop
 

B├Âylece, en pop├╝ler iki y├Ântemden ikisinin extend etkili oldu─čunu g├Âr├╝yoruz .


2







 lst1 = [1,2]

lst2 = [3,4]

def list_combinationer(Bushisms, are_funny):

    for item in lst1:
        lst2.append(item)
        lst1n2 = sorted(lst2)
        print lst1n2

list_combinationer(lst1, lst2)

[1,2,3,4]
 

1







 import itertools

A = list(zip([1,3,5,7,9],[2,4,6,8,10]))
B = [1,3,5,7,9]+[2,4,6,8,10]
C = list(set([1,3,5,7,9] + [2,4,6,8,10]))

D = [1,3,5,7,9]
D.append([2,4,6,8,10])

E = [1,3,5,7,9]
E.extend([2,4,6,8,10])

F = []
for a in itertools.chain([1,3,5,7,9], [2,4,6,8,10]):
    F.append(a)


print ("A: " + str(A))
print ("B: " + str(B))
print ("C: " + str(C))
print ("D: " + str(D))
print ("E: " + str(E))
print ("F: " + str(F))
 

Çıktı:

 A: [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
B: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
C: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
D: [1, 3, 5, 7, 9, [2, 4, 6, 8, 10]]
E: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
F: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
 

1







─░ki eski listeyi tutarken yeni bir liste istiyorsan─▒z:

 def concatenate_list(listOne, listTwo):
    joinedList = []
    for i in listOne:
        joinedList.append(i)
    for j in listTwo:
        joinedList.append(j)

    sorted(joinedList)

    return joinedList
 

1







 nums1[:] = sorted(nums1[:m] + nums2[:n])
 

-2