รายการ Python การันตีว่ามีองค์ประกอบอยู่ในลำดับที่แทรกอยู่หรือไม่?


318

ถ้าฉันมีรหัสหลามต่อไปนี้

>>> x = []
>>> x = x + [1]
>>> x = x + [2]
>>> x = x + [3]
>>> x
[1, 2, 3]

จะxรับประกันว่าจะเป็น[1,2,3]หรือจะเรียงลำดับองค์ประกอบระหว่างกาลอื่น ๆ ได้หรือไม่

คำตอบ:


479

ใช่ลำดับขององค์ประกอบในรายการหลามยังคงอยู่


17
นี่คือคำตอบที่ถูกต้องดังนั้นฉันไม่ต้องการเพิ่มอีก เขายังสามารถใช้ list.append เพื่อทำให้จิตใจของเขาสบายใจ docs.python.org/2/tutorial/datastructures.html
NG

1
จะทำอย่างไรถ้าฉันส่งคืนรายการท้องถิ่นจากฟังก์ชันและใช้สิ่งนั้นในฟังก์ชั่นการโทร นั่นคือdef fn_1(): lst = [] lst.append(1) lst.append(2) return lstและdef fn_2(): print(fn_1())คำสั่งซื้อจะเหมือนเดิมเสมอโดยไม่คำนึงถึงกี่ครั้งหรือที่เคยใช้ fn_1 ()
TheCuriousOne

6
ใช่ลำดับขององค์ประกอบในรายการหลามยังคงอยู่ ;)
sge

82

ในระยะสั้นใช่คำสั่งซื้อจะถูกเก็บไว้ ในระยะยาว:

โดยทั่วไปคำจำกัดความต่อไปนี้จะใช้กับวัตถุที่ต้องการรายการเสมอ:

รายการคือชุดขององค์ประกอบที่สามารถมีองค์ประกอบที่ซ้ำกันและมีคำสั่งที่กำหนดไว้ว่าโดยทั่วไปจะไม่เปลี่ยนเว้นแต่ทำอย่างชัดเจนที่จะทำเช่นนั้น สแต็คและคิวเป็นรายการทั้งสองประเภทที่มีพฤติกรรมที่เฉพาะเจาะจง (มักถูก จำกัด ) สำหรับการเพิ่มและลบองค์ประกอบ (สแต็กเป็น LIFO, คิวเป็น FIFO) รายการคือการนำเสนอรายการสิ่งต่างๆ สตริงสามารถถูกพิจารณาว่าเป็นรายการของอักขระเนื่องจากลำดับเป็นสิ่งสำคัญ ( "abc" != "bca") และอนุญาตให้ทำซ้ำในเนื้อหาของสตริงได้อย่างแน่นอน ( "aaa"สามารถมีอยู่และ!= "a")

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

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

รูปแบบการตั้งชื่อนี้มีความเป็นจริงสำหรับภาษาการเขียนโปรแกรมทั้งหมดที่ฉันรู้จักรวมถึง Python, C ++, Java, C # และ Lisp (ซึ่งรายการที่ไม่รักษาลำดับของพวกเขาจะเป็นความหายนะอย่างยิ่ง) หากใครรู้ว่าไม่มีกรณีนี้โปรดพูดและฉันจะแก้ไขคำตอบของฉัน โปรดทราบว่าการใช้งานเฉพาะอาจใช้ชื่ออื่นสำหรับวัตถุเหล่านี้เช่นvectorใน C ++ และflexใน ALGOL 68 (ทั้งสองรายการ; flex เป็นเทคนิคที่เป็นเพียงอาร์เรย์ที่ปรับขนาดได้อีกครั้ง)

หากมีความสับสนเกิดขึ้นในกรณีของคุณเนื่องจากลักษณะเฉพาะของการ+ทำงานของสัญญาณที่นี่เพียงแค่รู้ว่าคำสั่งซื้อนั้นมีความสำคัญต่อรายการและถ้าไม่มีเหตุผลที่ดีที่จะเชื่อมิฉะนั้นคุณสามารถสันนิษฐานได้ว่า . ในกรณีนี้+สัญญาณจะทำงานเหมือนที่ทำกับสตริง (ซึ่งเป็นเพียงรายการอักขระเท่านั้น): ใช้เนื้อหาของรายการและวางไว้ด้านหลังเนื้อหาของอีกรายการ

ถ้าเรามี

list1 = [0, 1, 2, 3, 4]
list2 = [5, 6, 7, 8, 9]

แล้วก็

list1 + list2

เป็นเช่นเดียวกับ

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

ซึ่งประเมินว่า

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

ชอบมาก

"abdcde" + "fghijk"

ผลิต

"abdcdefghijk"

1
ฉันอ่านบางที่เนื่องจากข้อมูลจำเพาะของอาร์เรย์ JSON ไม่ได้ระบุว่าการบำรุงรักษาอาร์เรย์ดำเนินการตามลำดับไม่รับประกันว่าจะรักษาลำดับ อย่างไรก็ตามฉันไม่สามารถหาแหล่งที่มาของเรื่องนั้นได้ และโครงสร้างพื้นฐานของ Array ยังคงเป็นกรณีพิเศษของวัตถุที่มีดัชนีที่มีหมายเลขดังนั้นมันจึงไม่ขัดแย้งกับคำสั่งของคุณ
Multihunter

1
ฉันไม่เห็นด้วยกับการอธิบายของชุด เซตไม่ใช่ "มุ่งสู่เป้าหมายทางคณิตศาสตร์และทฤษฎีมากกว่าชุดชีวิตจริง" อย่างแน่นอน แต่เซตนั้นมีประโยชน์มากเมื่อใดก็ตามที่เราต้องการคอลเล็กชั่นที่มีไอเท็มที่ไม่สามารถทำซ้ำได้และเสนอเครื่องมือต่าง ๆ เช่นความแตกต่างและจุดตัดที่มีประโยชน์ในการสร้างแบบจำลองกรณีการใช้ชีวิตจริง
Pintun

1
@Pintun มองย้อนกลับไปหลายปีหลังจากเขียนโพสต์นี้ฉันเห็นด้วยกับคุณ ฉันจะแก้ไขเมื่อฉันหาวิธีที่ดีกว่าในการแสดงสิ่งที่ฉันตั้งเป้าไว้
ApproachingDarknessFish

5

คุณกำลังสับสน 'ชุด' และ 'รายการ' ชุดไม่รับประกันการสั่งซื้อ แต่รายการทำ

{}ชุดมีการประกาศใช้วงเล็บปีกกา: []ในทางตรงกันข้ามรายการมีการประกาศใช้วงเล็บ:

mySet = {a, b, c, c}

ไม่รับประกันการสั่งซื้อ แต่รายการจะ:

myList = [a, b, c]

1
โปรดทราบว่าชุดยังรับประกันการทำซ้ำที่ไม่ รายการอาจมีองค์ประกอบที่ซ้ำกันชุดอาจไม่
นาธาเนียลฟอร์ด

4

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

แม้ว่าทุกอย่างใน Python จะไม่เปลี่ยนรูปก็ตาม ตัวอย่างเช่นรายการสามารถเปลี่ยนแปลงได้ --- สามารถเปลี่ยนแปลงได้หลังจากสร้างแล้ว ตัวอย่างเช่นถ้าคุณมีรายการ

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

ที่นี่ฉันเปลี่ยนรายการแรกของa(ฉันเพิ่ม7เข้าไป) ใครจะนึกภาพสับสิ่งต่าง ๆ รอบและรับสิ่งที่ไม่คาดคิดที่นี่ถ้าคุณไม่ระวัง (และแน่นอนสิ่งนี้เกิดขึ้นกับทุกคนเมื่อพวกเขาเริ่มเขียนโปรแกรมใน Python ไม่ทางใดก็ทางหนึ่งเพียงค้นหาไซต์นี้เพื่อ "แก้ไขรายการในขณะที่วนรอบ มัน "เพื่อดูตัวอย่างหลายสิบ)

มันก็คุ้มค่าที่ชี้ให้เห็นว่าx = x + [a]และx.append(a)ไม่เหมือนกัน อย่างที่สองการแปรรูปและคนแรกที่สร้างรายการใหม่และกำหนดที่จะx xเพื่อให้เห็นความแตกต่างให้ลองตั้งค่าy = xก่อนที่จะเพิ่มอะไรให้และพยายามที่แต่ละคนและลักษณะที่แตกต่างกันทั้งสองให้แก่xy


0

alist = [1,2,3]

i = 0

for item in aList:  

    if i<2:  

            aList.remove(item)  

    i+=1  

alist

[2]

คุณธรรมคือเมื่อแก้ไขรายการในลูปที่ขับเคลื่อนโดยรายการนั้นมีสองขั้นตอน:

aList=[1,2,3]
i=0
for item in aList:
    if i<2:
        aList[i]="del"
    i+=1

aList

['del', 'del', 3]
for i in range(2):
    del aList[0]

aList
[3]

0

ใช่มีการเรียงลำดับรายการและสิ่งอันดับในขณะที่พจนานุกรมไม่ใช่


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