ฉันจะต่อสองรายการใน Python ได้อย่างไร


2529

ฉันจะต่อสองรายการใน Python ได้อย่างไร

ตัวอย่าง:

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

ผลลัพธ์ที่คาดหวัง:

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

6
คุณต้องการต่อท้ายหรือคุณต้องการรวมสองรายการตามลำดับที่เรียง ? ผลลัพธ์ที่คุณคาดหวังสำหรับ [1,3,6] และ [2,4,5] คืออะไร เราสามารถสมมติว่าทั้งสองรายการย่อยนั้นเรียงลำดับแล้ว (เหมือนในตัวอย่างของคุณ)?
smci

1
... นอกจากนี้ยังมีสิ่งที่ถ้ารายการมีรายการที่ซ้ำกันเช่น[1,2,5] and [2,4,5,6]? คุณต้องการให้มีรายการที่ซ้ำกันรวมแยกออกหรือไม่สนใจหรือไม่
smci

คำตอบ:


3902

คุณสามารถใช้+โอเปอเรเตอร์เพื่อรวม:

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

joinedlist = listone + listtwo

เอาท์พุท:

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

110
สิ่งนี้จะสร้างสำเนาลึก listone และผนวก listtwo?
Daniel F

152
@Daniel มันจะสร้างรายการใหม่พร้อมสำเนาตื้นของรายการในรายการแรกตามด้วยสำเนาตื้นของรายการในรายการที่สอง ใช้ copy.deepcopy เพื่อรับสำเนาลึก
Daniel G

219
รายละเอียดอื่นที่เป็นประโยชน์ที่นี่: listone += listtwoส่งผลให้listone == [1, 2, 3, 4, 5, 6]
rickcnagy

16
@ br1ckb0t จะเปลี่ยนสิ่งที่ listone ชี้ไปที่ใด ดังนั้นlist3 = listone listone+=listtwo list3 ก็เปลี่ยนไปเช่นกัน?
MikeH

11
มันเปลี่ยน list3 อย่างไรก็ตามหากนั่นไม่ใช่ปัญหาคุณสามารถเพิ่มรายการทั้งสองได้ง่ายขึ้นแทนที่จะสร้างรายการใหม่
rickcnagy

317

นอกจากนี้ยังเป็นไปได้ที่จะสร้างเครื่องกำเนิดไฟฟ้าที่เพียง iterates itertools.chain()กว่ารายการในทั้งสองรายการโดยใช้ สิ่งนี้อนุญาตให้คุณโยงรายชื่อ (หรือทำซ้ำได้) เข้าด้วยกันเพื่อการประมวลผลโดยไม่ต้องคัดลอกรายการไปยังรายการใหม่:

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

4
chainอยู่ทางด้านช้า (แต่ไม่มากนัก) สำหรับสองรายการ แต่เป็นวิธีที่เร็วที่สุดในการโยงหลายรายการ (n >> 2)
cs95

@ cs95 ช้าเมื่อเทียบกับอะไร
Moberg

@Moberg เมื่อเทียบกับวิธีการอื่น ๆ ของรายการเชื่อมโยงสำหรับการอ้างอิงโปรดดูมาตรฐานของฉันที่นี่
cs95

263

>= 3.5ทางเลือกหลาม:[*l1, *l2]

ทางเลือกอื่นได้รับการแนะนำผ่านการยอมรับPEP 448ซึ่งสมควรกล่าวถึง

PEP มีชื่อว่าGeneral Unpacking Generalisationโดยทั่วไปจะลดข้อ จำกัด ทางไวยากรณ์เมื่อใช้*นิพจน์ที่ติดดาวใน Python ด้วยการเข้าร่วมสองรายการ (ใช้ได้กับการทำซ้ำใด ๆ ) สามารถทำได้ด้วย:

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

ฟังก์ชั่นนี้ถูกกำหนดไว้สำหรับ Python3.5มันไม่ได้รับการย้อนกลับไปยังรุ่นก่อนหน้าใน3.xตระกูล ในรุ่นที่ไม่รองรับSyntaxErrorจะมีการยกระดับ

เช่นเดียวกับวิธีอื่น ๆ สิ่งนี้ก็สร้างเหมือนสำเนาตื้นขององค์ประกอบในรายการที่สอดคล้องกัน


คว่ำแนวทางนี้คือการที่คุณจริงๆทำรายการไม่ต้องเพื่อที่จะดำเนินการอะไรที่เป็น iterable จะทำ ตามที่ระบุไว้ใน PEP:

นี้ยังเป็นประโยชน์เป็นวิธีที่สามารถอ่านได้มากขึ้นจากข้อสรุป iterables ลงในรายการเช่นซึ่งขณะนี้เทียบเท่ากับเพียงmy_list + list(my_tuple) + list(my_range)[*my_list, *my_tuple, *my_range]

ดังนั้นในขณะที่การเพิ่ม+จะเพิ่มTypeErrorเนื่องจากชนิดไม่ตรงกัน:

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

สิ่งต่อไปนี้จะไม่:

res = [*l, *r]

เพราะมันจะแกะเนื้อหาของ iterables ออกก่อนจากนั้นก็สร้างlistจากเนื้อหา


1
ตัวอย่างที่ดีของวิธีการคลายกล่องที่ทำงานกับชนิดที่ทำซ้ำได้คือฟังก์ชั่นที่คืนค่าตัววนซ้ำในรายการใดรายการหนึ่งที่คุณกำลังต่อกันอยู่ res = [*l1, *reversed(l2)]ตัวอย่างเช่นคุณสามารถกลับหนึ่งของรายการที่คุณกำลังเชื่อมโยง: เนื่องจากreversedส่งคืนตัววนซ้ำres = l1 + reversed(l2)จะทำให้เกิดข้อผิดพลาด
อลัน

2
มันน่าสังเกตว่ามันคล้ายกับการรวมพจนานุกรมเข้ากับไพ ธ อน dict3 = {** dict1, ** dict2} โปรดสังเกตว่าเราใช้ ** เพื่อแกะพจนานุกรมในขณะที่มีรายการที่เราใช้ * เพื่อแกะกล่อง
Kevin S

212

คุณสามารถใช้ชุดเพื่อรับรายการรวมค่าที่ไม่ซ้ำกัน

mergedlist = list(set(listone + listtwo))

45
ทรูมันจะลบรายการที่ซ้ำกันถ้านั่นคือสิ่งที่คุณสนใจรายชื่อนอกจากจะไม่ทำเช่นนั้น
metasoarous

1
วิธีการทำเช่นนั้นและเก็บข้อมูลการสั่งซื้อคืออะไร?
Natim

11
ดีกว่าlistone + [x for x in listtwo if x not in listone]
Natim

8
1 IMHO นี้เป็นวิธีที่ถูกต้อง "ผสาน" (สหภาพ) รายการขณะที่ "อนุมัติ" คำตอบที่อธิบายถึงวิธีการที่จะรวม / เพิ่มรายการ (MultiSet)
alfasin

2
หากคุณสนใจเกี่ยวกับการรักษาลำดับการป้อนข้อมูลจากนั้นimport collections; mergedlist = list(collections.OrderedDict.fromkeys(listone + listtwo))จะทำการหลอกลวง
SethMMorton

185

คุณสามารถใช้list.extend()วิธีนี้เพื่อเพิ่ม a listไปยังจุดสิ้นสุดของอีกอันหนึ่ง:

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

listone.extend(listtwo)

หากคุณต้องการให้รายการดั้งเดิมไม่เปลี่ยนแปลงคุณสามารถสร้างlistวัตถุใหม่และextendรายการทั้งสอง:

mergedlist = []
mergedlist.extend(listone)
mergedlist.extend(listtwo)

80

ฉันจะต่อสองรายการใน Python ได้อย่างไร

จาก 3.7 นี่เป็นวิธีการ stdlib ที่ได้รับความนิยมมากที่สุดสำหรับการต่อสองรายการ (หรือมากกว่า) ในไพ ธ อน

ป้อนคำอธิบายรูปภาพที่นี่

เชิงอรรถ

  1. นี่เป็นวิธีการแก้ปัญหาที่ลื่นเพราะความกระชับ แต่sumดำเนินการเรียงต่อกันแบบคู่ตามลำดับซึ่งหมายความว่านี่เป็นการดำเนินการกำลังสองเนื่องจากต้องจัดสรรหน่วยความจำสำหรับแต่ละขั้นตอน อย่าใช้ถ้ารายการของคุณมีขนาดใหญ่

  2. ดูchain และ chain.from_iterable จากเอกสาร คุณจะต้องimport itertoolsก่อน การต่อข้อมูลเป็นเชิงเส้นในหน่วยความจำดังนั้นนี่จึงเป็นสิ่งที่ดีที่สุดในแง่ของประสิทธิภาพและความเข้ากันได้ของรุ่น chain.from_iterableได้รับการแนะนำใน 2.6

  3. วิธีนี้ใช้การแยกบรรจุทั่วไปเพิ่มเติม (PEP 448)แต่ไม่สามารถพูดคุยกับรายการ N ได้เว้นแต่คุณจะแกะกล่องด้วยตนเองด้วยตนเอง

  4. a += bและa.extend(b)มีความเท่าเทียมกันมากหรือน้อยสำหรับวัตถุประสงค์ในทางปฏิบัติทั้งหมด +=เมื่อเรียกในรายการจะโทรภายใน list.__iadd__ซึ่งขยายรายการแรกโดยที่สอง


ประสิทธิภาพ

การต่อข้อมูล 2 รายการ1

ป้อนคำอธิบายรูปภาพที่นี่

ไม่มีความแตกต่างกันมากระหว่างวิธีการเหล่านี้ แต่นั่นก็สมเหตุสมผลเนื่องจากทุกคนมีลำดับความซับซ้อนเท่ากัน (เป็นเส้นตรง) ไม่มีเหตุผลใดที่จะชอบอันใดอันหนึ่งยกเว้นเป็นเรื่องของสไตล์

การต่อข้อมูล N-List

ป้อนคำอธิบายรูปภาพที่นี่

แปลงได้ถูกสร้างขึ้นโดยใช้โมดูลperfplot รหัสสำหรับการอ้างอิงของคุณ

1. The iadd( +=) และextendวิธีการทำงานในสถานที่ดังนั้นจึงต้องสร้างสำเนาทุกครั้งก่อนการทดสอบ เพื่อให้ทุกสิ่งเป็นไปอย่างยุติธรรมวิธีการทั้งหมดมีขั้นตอนการคัดลอกล่วงหน้าสำหรับรายการทางด้านซ้ายซึ่งสามารถละเว้นได้


ความคิดเห็นเกี่ยวกับโซลูชั่นอื่น ๆ

  • ห้ามใช้วิธี DUNDER list.__add__โดยตรงไม่ว่าในรูปแบบหรือรูปแบบใด ๆ ในความเป็นจริงหลีกเลี่ยงวิธีการ dunder และใช้ผู้ประกอบการและoperatorฟังก์ชั่นเช่นที่พวกเขาถูกออกแบบมาสำหรับ งูหลามมีความหมายอย่างระมัดระวังอบเข้ามาซึ่งมีความซับซ้อนมากกว่าแค่เรียกเสียงฟ้าร้องโดยตรง นี่คือตัวอย่าง ดังนั้นเพื่อสรุปa.__add__(b)=> BAD; a + b=> ดี

  • คำตอบบางข้อเสนอที่นี่reduce(operator.add, [a, b])สำหรับการต่อข้อมูลแบบคู่ - นี่เป็นคำเดียวที่sum([a, b], [])มากกว่า

  • วิธีใดก็ตามที่ใช้setจะทำให้รายการซ้ำซ้อนและสูญเสียการสั่งซื้อ ใช้ด้วยความระมัดระวัง

  • for i in b: a.append(i)เป็นคำที่มากขึ้นและช้ากว่าa.extend(b)ซึ่งเป็นฟังก์ชั่นการโทรเดียวและสำนวนมากขึ้น appendช้าลงเนื่องจากความหมายที่มีการจัดสรรและพัฒนาหน่วยความจำสำหรับรายการ ดูที่นี่สำหรับการสนทนาที่คล้ายกัน

  • heapq.mergeจะใช้งานได้ แต่กรณีการใช้งานนั้นใช้สำหรับการรวมรายการที่เรียงลำดับในเวลาเชิงเส้น การใช้มันในสถานการณ์อื่น ๆ เป็นการป้องกันรูปแบบ

  • yieldองค์ประกอบรายการจากฟังก์ชั่นเป็นวิธีที่ยอมรับได้ แต่chainทำสิ่งนี้ได้เร็วขึ้นและดีขึ้น (มันมีโค้ดพา ธ ใน C ดังนั้นมันจึงเร็ว)

  • operator.add(a, b)a + bเป็นที่ยอมรับการทำงานเทียบเท่า มันเป็นกรณีการใช้งานส่วนใหญ่สำหรับวิธีการจัดส่งแบบไดนามิก มิฉะนั้นต้องการa + bซึ่งเป็นสั้นและอ่านได้มากขึ้นในความคิดของฉัน YMMV


คำตอบสำหรับstackoverflow.com/q/36863404/125507สามารถใช้พล็อตแบบพล็อต (รวมถึงโซลูชัน numba)
endolith

@ endolith ล้นมือกับการทำงาน แต่ฉันจะดูและดูว่าฉันสามารถชิปค่ะ
cs95

ซึ่งเป็นวิธีที่ดีที่สุดแล้วประสิทธิภาพฉลาดเร็วกว่า? กรุณาบอก
ganeshdeshmukh

@ganeshdeshmukh TL; DR เป็นสิ่งที่ดีและสิ่งที่คุณเลือกนั้นส่วนใหญ่เป็นเรื่องของสไตล์ "There's not much difference between these methods but that makes sense given they all have the same order of complexity (linear). There's no particular reason to prefer one over the other except as a matter of style."วิธีแก้ไขปัญหาไม่ได้อยู่ในคำตอบของฉันหรือวิจารณ์ใน" ความคิดเห็น "ฉันแนะนำให้ไม่ใช้
cs95


51

คำถามนี้ถามโดยตรงเกี่ยวกับการเข้าร่วมสองรายการ อย่างไรก็ตามมันค่อนข้างสูงในการค้นหาแม้ว่าคุณกำลังมองหาวิธีการเข้าร่วมหลายรายการ (รวมถึงกรณีเมื่อคุณเข้าร่วมรายการศูนย์)

ฉันคิดว่าตัวเลือกที่ดีที่สุดคือการใช้ list comprehensions:

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

คุณสามารถสร้างเครื่องกำเนิดไฟฟ้าได้เช่นกัน:

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

คำตอบเก่า

พิจารณาวิธีการทั่วไปที่มากกว่านี้:

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

จะส่งออก:

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

หมายเหตุนี้ยังใช้งานได้อย่างถูกต้องเมื่อaเป็นหรือ[][[1,2,3]]

อย่างไรก็ตามสามารถทำได้อย่างมีประสิทธิภาพด้วยitertools:

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

หากคุณไม่จำเป็นต้องมีlistแต่เพียง iterable list()ละเว้น

ปรับปรุง

ทางเลือกที่แพทริคคอลลินส์แนะนำในการแสดงความคิดเห็นอาจช่วยคุณได้เช่นกัน:

sum(a, [])

3
Python 3 note: reduceตอนนี้อยู่ในfunctoolsดังนั้นคุณจะต้องนำเข้าก่อน
Dimitris Fasarakis Hilliard

41

คุณสามารถใช้+หรือ+=ตัวดำเนินการดังต่อไปนี้:

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

c = a + b

หรือ:

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

c += (a + b)

นอกจากนี้หากคุณต้องการให้ค่าในรายการที่ผสานเป็นค่าเฉพาะคุณสามารถทำได้:

c = list(set(a + b))

ส่วนสุดท้ายสามารถสั่งซื้อรายการอีกครั้งโดยพลการ หากคุณต้องการรักษาความสงบเรียบร้อยไว้ใน CPython 3.6+ คุณสามารถทำได้list(dict.fromkeys(a + b))
Boris

27

มันเป็นที่น่าสังเกตว่าitertools.chainฟังก์ชั่นยอมรับจำนวนตัวแปรของการขัดแย้ง:

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

หาก iterable (tuple, list, generator, ฯลฯ ) เป็นอินพุตfrom_iterableวิธีการเรียนอาจจะใช้:

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

22

ด้วย Python 3.3+ คุณสามารถใช้ผลตอบแทนจาก :

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]

หรือถ้าคุณต้องการสนับสนุนจำนวนตัววนซ้ำโดยพลการ:

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]

คุณสามารถใช้itertools.chain(ซึ่งเทียบเท่า) แทนการกำหนดฟังก์ชั่นของคุณเอง
บอริส

18

หากคุณต้องการรวมสองรายการในรูปแบบที่เรียงลำดับคุณสามารถใช้mergeฟังก์ชันจากheapqไลบรารี

from heapq import merge

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

print list(merge(a, b))

15

หากคุณไม่สามารถใช้ตัวดำเนินการบวก ( +) คุณสามารถใช้operatorการนำเข้า:

import operator

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

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

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

หรือคุณสามารถใช้ฟังก์ชัน__add__ dunder :

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

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

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

3
Dunders โลภโดยทั่วไปไม่ใช่วิธีที่ดีที่สุด หากปิดตารางการใช้งาน+ operator.add
Dimitris Fasarakis Hilliard

2
เหตุใดตัวดำเนินการบวกจะไม่พร้อมใช้งาน
cs01

2
โดยปกติแล้วจะไม่ :) แต่ถ้าคุณกำลังทำ list concatenation ด้วยฟังก์ชั่น map หรือต้องการเก็บฟังก์ชั่น add ในตัวแปรคุณไม่สามารถใช้ +
jpihl

13

วิธีทั่วไปสำหรับรายการเพิ่มเติมคุณสามารถใส่ไว้ในรายการและใช้ฟังก์ชันitertools.chain.from_iterable()1ซึ่งยึดตามคำตอบนี้เป็นวิธีที่ดีที่สุดสำหรับการเรียงรายการที่ซ้อนกัน:

>>> 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 และใหม่กว่า ในรุ่นอื่น ๆ chain(*l)ใช้


10

หากคุณต้องการรวมรายการที่เรียงลำดับสองรายการด้วยกฎการเรียงลำดับที่ซับซ้อนคุณอาจต้องหมุนรายการด้วยตนเองในรหัสต่อไปนี้ (โดยใช้กฎการเรียงลำดับแบบง่าย ๆ เพื่อให้อ่านง่าย :-))

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

heapq.mergeหรือการใช้งานเพียงแค่
cs95

7

คุณสามารถใช้append()วิธีการที่กำหนดไว้ในlistวัตถุ:

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

9
เพื่อให้คุณรู้ว่าถ้านี่คือสิ่งที่คุณกำลังทำอยู่นี่จะช้ากว่าวิธีอื่น ๆ ดูstackoverflow.com/questions/17479361/…
Ryan Haining


6

ตามที่หลายคนชี้ไปแล้วitertools.chain()เป็นวิธีที่จะไปหากจำเป็นต้องใช้การรักษาแบบเดียวกันกับทั้งสองรายการ ในกรณีของฉันฉันมีป้ายกำกับและธงซึ่งแตกต่างจากรายการหนึ่งไปอีกรายการหนึ่งดังนั้นฉันต้องการบางสิ่งที่ซับซ้อนกว่าเล็กน้อย เมื่อมันปรากฏออกมาเบื้องหลังitertools.chain()จะทำสิ่งต่อไปนี้:

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

(ดูhttps://docs.python.org/2/library/itertools.html ) ดังนั้นฉันจึงได้แรงบันดาลใจจากที่นี่และเขียนบางสิ่งตามบรรทัดเหล่านี้:

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
        [...]

ประเด็นหลักที่ต้องทำความเข้าใจที่นี่คือรายการเป็นเพียงกรณีพิเศษของ iterable ซึ่งเป็นวัตถุที่เหมือนกัน และfor ... inลูปในไพ ธ อนสามารถทำงานกับตัวแปรทูเพิลได้ดังนั้นจึงง่ายต่อการวนซ้ำกับตัวแปรหลายตัวในเวลาเดียวกัน


5

ใช้รายการเข้าใจง่าย:

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

มันมีข้อดีทั้งหมดของวิธีการใหม่ล่าสุดในการใช้General Unpacking Generalizationsเช่นคุณสามารถเชื่อมต่อจำนวน iterables ที่แตกต่างกันตามอำเภอใจ (ตัวอย่างเช่น list, tuples, range, และ generators) แบบนั้น - และไม่ จำกัด Python 3.5 หรือใหม่กว่า .


4

วิธีกระชับรายการรวมของรายการคือ

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

ซึ่งทำให้เรา

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

กรุณาอย่าใช้list.__add__ใช้operator.addแทน นี่เป็นสิ่งที่เทียบเท่ากับคำพูดsum(list_of_lists, [])ที่เลวร้าย ไม่ได้ใช้!
cs95

@ cs95 คุณสามารถอธิบายสิ่งที่เป็นปัญหาได้โดยใช้รายการ. _ add__
Akash Singh

วิธีการ dunder เป็น "วิธีส่วนตัว" และโดยทั่วไปไม่ควรใช้โดยตรง (ถูกเรียกโดยฟังก์ชั่นอื่น ๆ ) ข้อยกเว้นคือobj.__class__และobj.__dict__.
cs95

3

ใน Python คุณสามารถเชื่อมมิติที่เข้ากันได้สองอาร์เรย์เข้าด้วยกันด้วยคำสั่งนี้

numpy.concatenate([a,b])

4
คำถามไม่ได้ขอสิ่งใด
cs95

2

ดังนั้นมีสองวิธีง่าย ๆ

  1. การใช้+ : มันสร้างรายการใหม่จากรายการที่ให้ไว้

ตัวอย่าง:

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. การใช้ขยาย : มันผนวกรายการใหม่ไปยังรายการที่มีอยู่ นั่นหมายความว่าจะไม่สร้างรายการแยกต่างหาก

ตัวอย่าง:

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

ดังนั้นเราเห็นว่าวิธีการยอดนิยมสองวิธีextendนั้นมีประสิทธิภาพ


2
ถ้าฉันต้องการเพิ่มหลายรายการเช่น + b + c + d + e
Tweakimp

2
@Takakimp ดูคำตอบนี้ซึ่งมีสองตัวเลือก (ฉันแนะนำchain.from_iterable)
cs95

2

มีหลายวิธีในการเชื่อมต่อรายการในงูหลาม

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

1. new_list = l1.extend(l2)
2. new_list = l1 + l2
3. new_list = [*l1, *l2]

1
คุณช่วยอธิบายข้อมูลใหม่ที่คำตอบนี้ให้กับคนอื่นได้ไหม
cs95

มีหลายวิธีในการเชื่อมต่อรายการในงูหลามซึ่งครอบคลุมทั้งหมดในคำตอบที่เก่ากว่าอื่น ๆ ข้อมูลใหม่นี้ให้อะไร?
Tomerikoo

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

เอาท์พุท:

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

หากคุณต้องการรายการใหม่ในขณะที่รักษารายการเก่าสองรายการ:

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

    sorted(joinedList)

    return joinedList

แตกต่างจากคำตอบนี้โดยหมิงเซียวอย่างไร
Tomerikoo

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

4
โปรดอธิบายให้
หน่อย

อะไรคือข้อโต้แย้งของฟังก์ชั่นถ้าคุณใช้ชื่อส่วนกลางภายในมัน?
Tomerikoo

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.