ความแตกต่างระหว่างวิธีการรายการของงูใหญ่ผนวกและขยายคืออะไร?


3116

ความแตกต่างระหว่างวิธีรายการappend()กับextend()อะไร

คำตอบ:


5250

append: ผนวกวัตถุในตอนท้าย

x = [1, 2, 3]
x.append([4, 5])
print (x)

ให้คุณ: [1, 2, 3, [4, 5]]


extend: ขยายรายการโดยการต่อท้ายองค์ประกอบจาก iterable

x = [1, 2, 3]
x.extend([4, 5])
print (x)

ให้คุณ: [1, 2, 3, 4, 5]


122
ความแตกต่างระหว่างคืออะไรextendและก็ใช้ประกอบการนอกจากนี้ - ในตัวอย่างข้างต้นx = x + [4, 5]?
Rohan

303
ที่จริงมีความแตกต่างใหญ่ - x + [4, 5]ช่วยให้คุณมีรายการใหม่ที่กำหนดให้กับ x - x.extend()กลายพันธุ์รายการเดิม ฉันทำอย่างละเอียดในคำตอบของฉันที่นี่ด้านล่าง
Aaron Hall

@AaronHall @Rohan x += [4,5]แต่มันก็เป็นเช่นเดียวกับ
Astitva Srivastava

1
@AstitvaSrivastava ที่จริงแล้วฉันคิดว่าการขยายจะเร็วขึ้นในแง่ของ bytecode
MilkyWay90

1
คำหลักเมื่อใช้appendเป็นวัตถุ หากคุณพยายามที่จะใช้extendและคุณผ่านพจนานุกรมมันจะผนวกคีย์และไม่แฮชทั้งหมดจนถึงส่วนท้ายของอาร์เรย์
Anthony

640

appendเพิ่มองค์ประกอบให้กับรายการและextendเชื่อมโยงรายการแรกกับรายการอื่น (หรือทำซ้ำได้อีกรายการหนึ่งโดยไม่จำเป็นต้องเป็นรายการ)

>>> li = ['a', 'b', 'mpilgrim', 'z', 'example']
>>> li
['a', 'b', 'mpilgrim', 'z', 'example']

>>> li.append("new")
>>> li
['a', 'b', 'mpilgrim', 'z', 'example', 'new']

>>> li.append(["new", 2])
>>> li
['a', 'b', 'mpilgrim', 'z', 'example', 'new', ['new', 2]]

>>> li.insert(2, "new")
>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', ['new', 2]]

>>> li.extend(["two", "elements"])
>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', ['new', 2], 'two', 'elements']

489

ความแตกต่างระหว่างวิธีการรายการต่อท้ายและขยายคืออะไร?

  • appendเพิ่มอาร์กิวเมนต์เป็นองค์ประกอบเดียวในตอนท้ายของรายการ ความยาวของรายการจะเพิ่มขึ้นทีละรายการ
  • extendวนซ้ำของอาร์กิวเมนต์เพิ่มแต่ละองค์ประกอบลงในรายการขยายรายการ ความยาวของรายการจะเพิ่มขึ้นตามองค์ประกอบหลายอย่าง แต่อยู่ในการโต้แย้งที่ทำซ้ำได้

append

list.appendวิธีการผนวกวัตถุไปยังจุดสิ้นสุดของรายการ

my_list.append(object) 

ไม่ว่าจะเป็นวัตถุอะไรไม่ว่าจะเป็นตัวเลขสตริงรายการอื่นหรืออะไรก็ตามมันก็จะถูกเพิ่มเข้าไปที่ส่วนท้ายของmy_listรายการเดียวในรายการ

>>> my_list
['foo', 'bar']
>>> my_list.append('baz')
>>> my_list
['foo', 'bar', 'baz']

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

>>> another_list = [1, 2, 3]
>>> my_list.append(another_list)
>>> my_list
['foo', 'bar', 'baz', [1, 2, 3]]
                     #^^^^^^^^^--- single item at the end of the list.

extend

list.extendวิธีการขยายรายการโดยการผนวกองค์ประกอบจาก iterable นี้:

my_list.extend(iterable)

ดังนั้นเมื่อขยายองค์ประกอบแต่ละส่วนของ iterable จะถูกผนวกเข้ากับรายการ ตัวอย่างเช่น:

>>> my_list
['foo', 'bar']
>>> another_list = [1, 2, 3]
>>> my_list.extend(another_list)
>>> my_list
['foo', 'bar', 1, 2, 3]

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

>>> my_list.extend('baz')
>>> my_list
['foo', 'bar', 1, 2, 3, 'b', 'a', 'z']

ตัวดำเนินการโอเวอร์โหลด__add__( +) และ__iadd__( +=)

ทั้งสอง+และผู้ประกอบการที่มีการกำหนดไว้สำหรับ+= listพวกมันมีความหมายคล้ายกันที่จะขยาย

my_list + another_list สร้างรายการที่สามในหน่วยความจำเพื่อให้คุณสามารถส่งคืนผลลัพธ์ได้ แต่ต้องการให้รายการที่สองที่สามารถทำซ้ำได้นั้นเป็นรายการ

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

อย่าสับสน - my_list = my_list + another_listไม่เท่ากับ+=- ให้รายชื่อใหม่ที่กำหนดให้กับ my_list

ความซับซ้อนของเวลา

ผนวกมีความซับซ้อนของเวลาคงที่ O (1)

ส่วนขยายมีความซับซ้อนของเวลา O (k)

การวนซ้ำผ่านการเรียกหลายครั้งเพื่อappendเพิ่มความซับซ้อนทำให้เทียบเท่ากับการขยายและเนื่องจากการวนซ้ำของการขยายจะถูกใช้ใน C มันจะเร็วขึ้นเสมอหากคุณต้องการผนวกรายการต่อเนื่องจากรายการที่สามารถทำซ้ำได้

ประสิทธิภาพ

คุณอาจสงสัยว่าสิ่งใดมีประสิทธิภาพมากกว่าเนื่องจากสามารถใช้ผนวกเพื่อให้ได้ผลลัพธ์เช่นเดียวกับการขยาย ฟังก์ชั่นต่อไปนี้ทำสิ่งเดียวกัน:

def append(alist, iterable):
    for item in iterable:
        alist.append(item)

def extend(alist, iterable):
    alist.extend(iterable)

ดังนั้นขอเวลาพวกเขา:

import timeit

>>> min(timeit.repeat(lambda: append([], "abcdefghijklmnopqrstuvwxyz")))
2.867846965789795
>>> min(timeit.repeat(lambda: extend([], "abcdefghijklmnopqrstuvwxyz")))
0.8060121536254883

ที่อยู่ความคิดเห็นเกี่ยวกับการกำหนดเวลา

ผู้วิจารณ์พูดว่า:

คำตอบที่สมบูรณ์แบบฉันเพิ่งพลาดช่วงเวลาของการเปรียบเทียบการเพิ่มองค์ประกอบเดียวเท่านั้น

ทำสิ่งที่ถูกต้องทางความหมาย หากคุณต้องการที่จะผนวกองค์ประกอบทั้งหมดใน iterable extendใช้ appendหากคุณเพียงแค่เพิ่มองค์ประกอบหนึ่งในการใช้งาน

ตกลงดังนั้นเรามาสร้างการทดสอบเพื่อดูว่ามันทำงานอย่างไรในเวลา:

def append_one(a_list, element):
    a_list.append(element)

def extend_one(a_list, element):
    """creating a new list is semantically the most direct
    way to create an iterable to give to extend"""
    a_list.extend([element])

import timeit

และเราเห็นว่าการออกไปนอกเส้นทางของเราเพื่อสร้าง iterable เพียงแค่ใช้การขยายคือการเสียเวลา (เล็กน้อย):

>>> min(timeit.repeat(lambda: append_one([], 0)))
0.2082819009956438
>>> min(timeit.repeat(lambda: extend_one([], 0)))
0.2397019260097295

เราเรียนรู้จากสิ่งนี้ว่าไม่มีสิ่งใดที่ได้รับจากการใช้extendเมื่อเรามีเพียงองค์ประกอบเดียวที่จะผนวก

นอกจากนี้การกำหนดเวลาเหล่านี้ก็ไม่สำคัญเช่นกัน ฉันแค่แสดงให้พวกเขาเห็นว่าใน Python การทำสิ่งที่ถูกต้องทางความหมายคือการทำสิ่งที่ถูกต้อง

เป็นไปได้ว่าคุณอาจทดสอบการกำหนดเวลาในการดำเนินการที่เปรียบเทียบกันสองแบบและรับผลลัพธ์ที่คลุมเครือหรือผกผัน เพียงแค่มุ่งเน้นการทำสิ่งที่ถูกต้องทางความหมาย

ข้อสรุป

เราจะเห็นว่าextendเป็นความหมายที่ชัดเจนและมันสามารถทำงานได้เร็วกว่าappend, เมื่อคุณตั้งใจจะผนวกแต่ละองค์ประกอบใน iterable ไปยังรายการ

หากคุณมีเพียงองค์ประกอบเดียว (ไม่ได้อยู่ใน iterable) appendเพื่อเพิ่มลงในรายการการใช้งาน


1
@Aaron Hall หนึ่งความคิดเห็นเล็ก ๆ ในอัลกอริทึมสำหรับการกำหนดเวลา "extend_one" อาจกลับมาเวลา "ผิดเล็กน้อย" เนื่องจากการสร้างรายการนั้นเกี่ยวข้องด้วย อาจดีกว่าคือการสร้างรายการเป็นตัวแปร ( ex1 = 0และex2 = [0]) และส่งผ่านตัวแปรเหล่านี้หากคุณต้องการเข้มงวดมากขึ้น
ilias iliadis

19
คำตอบที่สมบูรณ์แบบแน่นอน แล้วประสิทธิภาพของl1 += l2vs l1.extend(l2)ล่ะ
Jean-Francois T.

6
@ Jean-FrancoisT .: l1 += l2และl1.extend(l2)ในที่สุดก็ใช้รหัสเดียวกัน ( list_extendฟังก์ชั่นในlistobject.c) ความแตกต่างเพียงอย่างเดียวคือ: 1. การ+=มอบหมายใหม่l1(สำหรับตัวเองสำหรับlists แต่การมอบหมายใหม่สนับสนุนประเภทที่ไม่เปลี่ยนรูปแบบซึ่งไม่ใช่วัตถุเดียวกันหลังจาก) ซึ่งทำให้ผิดกฎหมายหากl1เป็นคุณลักษณะของวัตถุที่ไม่เปลี่ยนรูปแบบจริง ตัวอย่างเช่นt = ([],), t[0] += lstจะล้มเหลวในขณะที่t[0].extend(lst)การทำงานหากว่า 2. l1 += l2ใช้รหัสไบต์โดยเฉพาะในขณะที่l1.extend(l2)ใช้วิธีส่งแบบทั่วไป นี้จะทำให้เร็วกว่า+= extend
ShadowRanger

3
ความจริงที่+=ต้องกำหนดใหม่l1หมายความว่าในบางกรณีการส่งช้าลงของextendบางส่วนหรือทั้งหมดสร้างขึ้นโดยไม่กำหนดกลับไปทางด้านซ้ายมือ ตัวอย่างเช่นถ้าlistเป็นคุณลักษณะของวัตถุself.l1 += l2และself.l1.extend(l2)มีประสิทธิภาพการทำงานที่เหมือนกันบน Python 3.6 ติดตั้งของฉันเพียงเพราะการดำเนินงานที่แท้จริงมากขึ้นเช่นself.l1 = self.l1.__iadd__(l2)ซึ่งหมายความว่ามันต้องดำเนินการที่มีราคาแพงในระดับปานกลางSTORE_ATTRที่self.l1.extend(l2)ไม่ได้มีการ
ShadowRanger

2
เปรียบเทียบง่าย ๆ ในการทดสอบในท้องถิ่น: สำหรับตัวแปรท้องถิ่น (ดังนั้นการ+=ใช้งานเพียงอย่างเดียวSTORE_FASTซึ่งราคาถูกสุด ๆ ) ซึ่งการเพิ่มมูลค่านั้นมีอยู่listด้วยหนึ่งรายการในนั้นโดยการดำเนินการซ้ำ 1,000 ครั้ง+=ใช้เวลาประมาณ 33 ns โดยเฉลี่ย ในขณะที่extendใช้เวลา 78 ns ความแตกต่างจาก 45 ns หากl1เป็นระดับโลก (ต้องมีราคาแพงกว่าSTORE_GLOBAL) ความแตกต่างจะแคบลงถึง 17 ns หากl1เป็นจริงlocal.l1(ต้องใช้ราคาแพงกว่าSTORE_ATTR) จะไม่มีความแตกต่างที่มีความหมายระหว่าง+=และextend(การกำหนดเวลาเหมือนกันโดยประมาณ; extendบางครั้งชนะ)
ShadowRanger

121

appendผนวกองค์ประกอบเดียว extendผนวกรายการขององค์ประกอบ

โปรดทราบว่าหากคุณส่งรายการเพื่อผนวกมันยังคงเพิ่มองค์ประกอบหนึ่ง:

>>> a = [1, 2, 3]
>>> a.append([4, 5, 6])
>>> a
[1, 2, 3, [4, 5, 6]]

62

ผนวกเทียบกับขยาย

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

ด้วยการผนวกคุณสามารถผนวกองค์ประกอบเดียวที่จะขยายรายการ:

>>> a = [1,2]
>>> a.append(3)
>>> a
[1,2,3]

หากคุณต้องการขยายองค์ประกอบมากกว่าหนึ่งรายการคุณควรใช้ส่วนขยายเนื่องจากคุณสามารถผนวกองค์ประกอบหนึ่งรายการหรือองค์ประกอบรายการหนึ่งรายการเท่านั้น:

>>> a.append([4,5])
>>> a
>>> [1,2,3,[4,5]]

เพื่อให้คุณได้รับรายการซ้อนกัน

แทนที่จะขยายคุณสามารถขยายองค์ประกอบเดียวเช่นนี้

>>> a = [1,2]
>>> a.extend([3])
>>> a
[1,2,3]

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

>>> a.extend([4,5,6])
>>> a
[1,2,3,4,5,6]

การเพิ่มองค์ประกอบหนึ่งที่มีทั้งสองวิธี

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

ทั้งผนวกและขยายสามารถเพิ่มองค์ประกอบหนึ่งไปยังจุดสิ้นสุดของรายการแม้ว่าการผนวกจะง่ายกว่า

ผนวก 1 องค์ประกอบ

>>> x = [1,2]
>>> x.append(3)
>>> x
[1,2,3]

ขยายองค์ประกอบหนึ่ง

>>> x = [1,2]
>>> x.extend([3])
>>> x
[1,2,3]

กำลังเพิ่มองค์ประกอบเพิ่มเติม ... ด้วยผลลัพธ์ที่แตกต่าง

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

>>> x = [1,2]
>>> x.append([3,4])
>>> x
[1,2,[3,4]]

ด้วยการขยายแทนคุณส่งรายการเป็นอาร์กิวเมนต์ แต่คุณจะได้รับรายการที่มีองค์ประกอบใหม่ที่ไม่ซ้อนในรายการเก่า

>>> z = [1,2] 
>>> z.extend([3,4])
>>> z
[1,2,3,4]

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

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

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


61

ตัวอย่างสองต่อไปนี้เทียบเท่ากันทางความหมาย:

for item in iterator:
    a_list.append(item)

และ

a_list.extend(iterator)

หลังอาจเร็วขึ้นเนื่องจากมีการใช้งานลูปใน C


20
ขยายเป็น ~ 4x เร็วขึ้นในเครื่องของฉันกว่าท้ายในวง (16us VS 4us 100 ลูปของศูนย์)
อเล็กซ์ L

6
extend()อาจ preallocates ในขณะที่append()มีแนวโน้มไม่
นักฟิสิกส์บ้า

@MadPhysicist: เพื่อประโยชน์ของความสมบูรณ์มีบางครั้งที่extend() ไม่สามารถจัดสรรล่วงหน้าได้อย่างมีเหตุผลเนื่องจากมีบาง iterables ไม่ได้ใช้__len__()แต่เหมือนคุณฉันจะแปลกใจถ้ามันไม่ลอง บางส่วนของการเพิ่มประสิทธิภาพการทำงานนอกจากนี้ยังมาจากการทำซ้ำส่วนหนึ่งใน C บริสุทธิ์แทนในหลามเป็นแหลมออกมาในคำตอบของอาโรน
Soren

44

append()วิธีการเพิ่มรายการเดียวที่ส่วนท้ายของรายการ

x = [1, 2, 3]
x.append([4, 5])
x.append('abc')
print(x)
# gives you
[1, 2, 3, [4, 5], 'abc']

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

x = [1, 2, 3]
x.extend([4, 5])
x.extend('abc')
print(x)
# gives you
[1, 2, 3, 4, 5, 'a', 'b', 'c']

จากดำน้ำลงในหลาม


คุณไม่สามารถขยายด้วย 6 เพียงเพราะมันไม่ได้ iterable และเอาต์พุตที่สองในตัวอย่างของคุณผิด 'abc' ได้รับการเพิ่มเป็นองค์ประกอบเดียวตั้งแต่คุณผ่านมันไปextendเป็นรายการที่มีองค์ประกอบหนึ่ง['abc']: [1, 2, 3, 4, 5, 'abc'] ที่จะทำให้การส่งออกตัวอย่างของคุณถูกต้องเปลี่ยน abc x.extend('abc')สายไปที่: และลบหรือเปลี่ยนไปx.extend(6) x.extend([6])
aneroid

37

คุณสามารถใช้ "+" สำหรับการกลับมาขยายแทนที่จะขยายในสถานที่

l1=range(10)

l1+[11]

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

l2=range(10,1,-1)

l1+l2

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

ในทำนองเดียวกัน+=สำหรับในพฤติกรรมของสถานที่ แต่มีความแตกต่างเล็กน้อยจาก&append extendหนึ่งในความแตกต่างที่ใหญ่ที่สุดของ+=จากappendและextendเมื่อมันถูกนำมาใช้ในขอบเขตฟังก์ชั่นดูบล็อกโพสต์นี้


การใช้ '+' เพื่อเพิ่มการขยายมีผลกับความซับซ้อนของเวลาหรือไม่
แฟรงคลิน

5
@franklin ดูคำตอบนี้สำหรับรายละเอียด: stackoverflow.com/a/28119966/2230844
denfromufa

1
ฉันไม่เห็นว่าสิ่งนี้ตอบคำถามได้อย่างไร
pppery

22

append(object) - อัปเดตรายการโดยเพิ่มวัตถุลงในรายการ

x = [20]
# List passed to the append(object) method is treated as a single object.
x.append([21, 22, 23])
# Hence the resultant list length will be 2
print(x)
--> [20, [21, 22, 23]]

extend(list) - เป็นหลักเชื่อมสองรายการ

x = [20]
# The parameter passed to extend(list) method is treated as a list.
# Eventually it is two lists being concatenated.
x.extend([21, 22, 23])
# Here the resultant list's length is 4
print(x)
[20, 21, 22, 23]

20

extend()สามารถใช้กับอาร์กิวเมนต์ตัววนซ้ำ นี่คือตัวอย่าง คุณต้องการสร้างรายชื่อออกจากรายชื่อด้วยวิธีนี้:

จาก

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

คุณต้องการ

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

คุณอาจใช้itertools.chain.from_iterable()เพื่อทำเช่นนั้น เอาต์พุตของเมธอดนี้เป็นตัววนซ้ำ มันใช้งานได้เทียบเท่า

def from_iterable(iterables):
    # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F
    for it in iterables:
        for element in it:
            yield element

กลับไปที่ตัวอย่างของเราเราทำได้

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

และรับรายการที่ต้องการ

นี่คือวิธีที่เท่าเทียมกันที่extend()สามารถใช้กับอาร์กิวเมนต์ตัววนซ้ำได้:

merged = []
merged.extend(itertools.chain.from_iterable(list2d))
print(merged)
>>>
[1, 2, 3, 4, 5, 6, 7, 8, 9]

2
คำตอบนี้ไม่ได้ขยายความคมชัดด้วยการผนวกดังนั้นจึงไม่ตอบคำถาม
pppery

19

นี่คือเทียบเท่าappendและextendใช้+โอเปอเรเตอร์:

>>> x = [1,2,3]
>>> x
[1, 2, 3]
>>> x = x + [4,5,6] # Extend
>>> x
[1, 2, 3, 4, 5, 6]
>>> x = x + [[7,8]] # Append
>>> x
[1, 2, 3, 4, 5, 6, [7, 8]]

ทำไมไม่ = +?! กระชับมากขึ้น
denfromufa

16

ผนวก () : โดยทั่วไปจะใช้ใน Python เพื่อเพิ่มองค์ประกอบหนึ่ง

ตัวอย่างที่ 1:

>> a = [1, 2, 3, 4]
>> a.append(5)
>> print(a)
>> a = [1, 2, 3, 4, 5]

ตัวอย่างที่ 2:

>> a = [1, 2, 3, 4]
>> a.append([5, 6])
>> print(a)
>> a = [1, 2, 3, 4, [5, 6]]

expand () : โดยที่ expand () ใช้เพื่อรวมสองรายการหรือแทรกหลายองค์ประกอบในรายการเดียว

ตัวอย่างที่ 1:

>> a = [1, 2, 3, 4]
>> b = [5, 6, 7, 8]
>> a.extend(b)
>> print(a)
>> a = [1, 2, 3, 4, 5, 6, 7, 8]

ตัวอย่างที่ 2:

>> a = [1, 2, 3, 4]
>> a.extend([5, 6])
>> print(a)
>> a = [1, 2, 3, 4, 5, 6]

12

จุดที่น่าสนใจที่ถูกบอกใบ้ แต่ไม่ได้อธิบายคือการขยายนั้นเร็วกว่าการผนวก สำหรับลูปใด ๆ ที่มีการผนวกไว้ข้างในควรพิจารณาว่าจะถูกแทนที่ด้วย list.extend (แปรรูป _elements)

โปรดจำไว้ว่าการผนวกองค์ประกอบใหม่อาจส่งผลให้การตอบกลับทั้งหมดของรายการไปยังตำแหน่งที่ดีขึ้นในหน่วยความจำ หากทำหลายครั้งเพราะเราผนวก 1 องค์ประกอบต่อครั้งประสิทธิภาพโดยรวมจะลดลง ในแง่นี้ list.extend คล้ายคลึงกับ "" .join (รายการสตริง)


12

ผนวกจะเพิ่มข้อมูลทั้งหมดในครั้งเดียว ข้อมูลทั้งหมดจะถูกเพิ่มไปยังดัชนีที่สร้างขึ้นใหม่ ในทางกลับกัน,extendขณะที่ชื่อแนะนำขยายอาร์เรย์ปัจจุบัน

ตัวอย่างเช่น

list1 = [123, 456, 678]
list2 = [111, 222]

ด้วยการappendที่เราได้รับ:

result = [123, 456, 678, [111, 222]]

ในขณะที่extendเราได้รับ:

result = [123, 456, 678, 111, 222]

8

พจนานุกรมภาษาอังกฤษกำหนดคำappendและextendเป็น:

ผนวก : เพิ่ม (บางสิ่ง) ที่ส่วนท้ายของเอกสารที่เป็นลายลักษณ์อักษร
ขยาย : ทำให้ใหญ่ขึ้น ขยายหรือขยาย


ด้วยความรู้นั้นตอนนี้มาทำความเข้าใจกันเถอะ

1) ความแตกต่างระหว่างappendและextend

append:

  • ผนวกวัตถุ Python ใด ๆ ตามที่เป็นอยู่ไปยังจุดสิ้นสุดของรายการ (เช่นเป็นองค์ประกอบสุดท้ายในรายการ)
  • รายการผลลัพธ์อาจซ้อนกันและมีองค์ประกอบที่แตกต่างกัน (เช่นรายการสตริง tuple พจนานุกรมชุด ฯลฯ )

extend:

  • ยอมรับiterableใด ๆเป็นอาร์กิวเมนต์และทำให้รายการใหญ่ขึ้น
  • รายการที่เกิดอยู่เสมอหนึ่งรายการมิติ (เช่นไม่มีการทำรัง) และมันอาจมีองค์ประกอบที่แตกต่างกันอยู่ในนั้น (เช่นตัวอักษรจำนวนเต็ม float) list(iterable)เป็นผลมาจากการใช้

2) ความคล้ายคลึงกันระหว่างappendและextend

  • ทั้งสองใช้อาร์กิวเมนต์เดียว
  • ทั้งการปรับเปลี่ยนรายการในสถานที่
  • Noneเป็นผลให้ทั้งผลตอบแทน

ตัวอย่าง

lis = [1, 2, 3]

# 'extend' is equivalent to this
lis = lis + list(iterable)

# 'append' simply appends its argument as the last element to the list
# as long as the argument is a valid Python object
list.append(object)

5

ฉันหวังว่าฉันสามารถทำเสริมที่เป็นประโยชน์สำหรับคำถามนี้ หากรายการของคุณเก็บวัตถุชนิดเฉพาะตัวอย่างเช่นInfoนี่เป็นสถานการณ์ที่extendวิธีการไม่เหมาะสม: ในการforวนซ้ำและการสร้างInfoวัตถุทุกครั้งและการใช้extendเพื่อเก็บไว้ในรายการของคุณมันจะล้มเหลว ข้อยกเว้นเป็นดังนี้:

TypeError: วัตถุ 'ข้อมูล' ไม่สามารถทำซ้ำได้

แต่ถ้าคุณใช้appendวิธีนี้ผลลัพธ์ก็คือตกลง เนื่องจากทุกครั้งที่ใช้extendเมธอดเมธอดจะถือว่าเป็นรายการหรือประเภทคอลเลกชันอื่น ๆ วนซ้ำและวางหลังจากรายการก่อนหน้า วัตถุเฉพาะไม่สามารถทำซ้ำได้อย่างชัดเจน


4

เพื่อแยกแยะพวกมันอย่างสังหรณ์ใจ

l1 = ['a', 'b', 'c']
l2 = ['d', 'e', 'f']
l1.append(l2)
l1
['a', 'b', 'c', ['d', 'e', 'f']]

มันเหมือนกับl1การทำซ้ำร่างกายภายในร่างกายของเธอ (ซ้อนกัน)

# Reset l1 = ['a', 'b', 'c']
l1.extend(l2)
l1
['a', 'b', 'c', 'd', 'e', 'f']

มันเหมือนกับว่าคนสองคนที่แยกจากกันได้แต่งงานและสร้างครอบครัวที่เป็นหนึ่งเดียวกัน

นอกจากนี้ฉันทำ cheatsheet ครบถ้วนสมบูรณ์ของวิธีการของรายการทั้งหมดสำหรับการอ้างอิงของคุณ

list_methods = {'Add': {'extend', 'append', 'insert'},
                'Remove': {'pop', 'remove', 'clear'}
                'Sort': {'reverse', 'sort'},
                'Search': {'count', 'index'},
                'Copy': {'copy'},
                }

2

extend(L)Lขยายรายการโดยท้ายรายการทั้งหมดในรายการที่กำหนด

>>> a
[1, 2, 3]
a.extend([4])  #is eqivalent of a[len(a):] = [4]
>>> a
[1, 2, 3, 4]
a = [1, 2, 3]
>>> a
[1, 2, 3]
>>> a[len(a):] = [4]
>>> a
[1, 2, 3, 4]

0

append"ขยาย" รายการ (แทนที่) โดยรายการเดียววัตถุเดียวที่ส่งผ่าน (เป็นอาร์กิวเมนต์)

extend"ขยาย" รายการ (ในสถานที่) โดยมีหลายรายการที่วัตถุผ่าน (เป็นอาร์กิวเมนต์) มี

สิ่งนี้อาจทำให้strวัตถุสับสนเล็กน้อย

  1. หากคุณผ่านสตริงเป็นอาร์กิวเมนต์: appendจะเพิ่มรายการสตริงเดียวในตอนท้าย แต่ extendจะเพิ่มรายการ "single" 'str' จำนวนมากตามความยาวของสตริงนั้น
  2. หากคุณผ่านรายการของสตริงเป็นอาร์กิวเมนต์: appendจะยังคงเพิ่มรายการ 'รายการ' เดียวที่ส่วนท้ายและ extendจะเพิ่มรายการ 'รายการ' เป็นจำนวนมากตามความยาวของรายการที่ส่งผ่าน
def append_o(a_list, element):
    a_list.append(element)
    print('append:', end = ' ')
    for item in a_list:
        print(item, end = ',')
    print()

def extend_o(a_list, element):
    a_list.extend(element)
    print('extend:', end = ' ')
    for item in a_list:
        print(item, end = ',')
    print()
append_o(['ab'],'cd')

extend_o(['ab'],'cd')
append_o(['ab'],['cd', 'ef'])
extend_o(['ab'],['cd', 'ef'])
append_o(['ab'],['cd'])
extend_o(['ab'],['cd'])

ผลิต:

append: ab,cd,
extend: ab,c,d,
append: ab,['cd', 'ef'],
extend: ab,cd,ef,
append: ab,['cd'],
extend: ab,cd,

0

ผนวกและขยายเป็นหนึ่งในกลไกการขยายในหลาม

ผนวก: เพิ่มองค์ประกอบที่ส่วนท้ายของรายการ

my_list = [1,2,3,4]

ในการเพิ่มองค์ประกอบใหม่ลงในรายการเราสามารถใช้วิธีการผนวกในวิธีต่อไปนี้

my_list.append(5)

ตำแหน่งเริ่มต้นที่จะเพิ่มองค์ประกอบใหม่นั้นจะอยู่ในตำแหน่ง (ความยาว + 1) เสมอ

ส่วนแทรก: วิธีการแทรกถูกใช้เพื่อเอาชนะข้อ จำกัด ของการผนวก ด้วยการแทรกเราสามารถกำหนดตำแหน่งที่แน่นอนที่เราต้องการแทรกองค์ประกอบใหม่ได้

วิธีการอธิบายของการแทรก (ดัชนีวัตถุ) มันต้องใช้สองข้อโต้แย้งอันดับแรกคือดัชนีที่เราต้องการแทรกองค์ประกอบของเราและอันดับที่สององค์ประกอบนั้น

Example: my_list = [1,2,3,4]
my_list[4, 'a']
my_list
[1,2,3,4,'a']

ขยาย: มีประโยชน์มากเมื่อเราต้องการเข้าร่วมสองรายการขึ้นไปในรายการเดียว โดยไม่ขยายถ้าเราต้องการเข้าร่วมสองรายการวัตถุผลลัพธ์จะมีรายการ

a = [1,2]
b = [3]
a.append(b)
print (a)
[1,2,[3]]

หากเราพยายามเข้าถึงองค์ประกอบที่ pos 2 เราจะได้รับรายการ ([3]) แทนที่จะเป็นองค์ประกอบ ในการเข้าร่วมสองรายการเราจะต้องใช้ส่วนต่อท้าย

a = [1,2]
b = [3]
a.extend(b)
print (a)
[1,2,3]

เพื่อเข้าร่วมหลายรายการ

a = [1]
b = [2]
c = [3]
a.extend(b+c)
print (a)
[1,2,3]

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