Danh sách Python có được đảm bảo để các phần tử của nó được giữ theo thứ tự chúng được chèn vào không?


318

Nếu tôi có mã Python sau

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

Sẽ xđược đảm bảo luôn luôn [1,2,3], hoặc các thứ tự khác của các yếu tố tạm thời có thể?

Câu trả lời:


479

Có, thứ tự của các yếu tố trong danh sách python là liên tục.


17
Đây là câu trả lời đúng vì vậy tôi không muốn thêm câu trả lời khác. Anh ấy cũng có thể sử dụng list.append để thực sự an tâm. docs.python.org/2/tutorial/datastructures.html
NG.

1
nếu tôi trả về một danh sách cục bộ từ một hàm và sử dụng nó trong hàm gọi. Đó là def fn_1(): lst = [] lst.append(1) lst.append(2) return lstdef fn_2(): print(fn_1())Liệu thứ tự sẽ LUÔN LUÔN không phân biệt số lần tôi sử dụng fn_1 () bao nhiêu lần?
TheCantlyOne

6
Có, thứ tự của các yếu tố trong danh sách python là liên tục. ;)
sge

82

Tóm lại, có, trật tự được bảo tồn. Trong thời gian dài:

Nói chung, các định nghĩa sau sẽ luôn áp dụng cho các đối tượng như danh sách:

Một danh sách là một tập hợp các yếu tố mà có thể chứa các thành phần trùng lặp và có một trật tự xác định rằng nhìn chung không thay đổi trừ khi làm một cách rõ ràng để làm như vậy. ngăn xếphàng đợi là cả hai loại danh sách cung cấp hành vi cụ thể (thường bị giới hạn) để thêm và xóa các thành phần (ngăn xếp là LIFO, hàng đợi là FIFO). Danh sách là đại diện thực tế của, tốt, danh sách các điều. Một chuỗi có thể được coi là một danh sách các ký tự, vì thứ tự là quan trọng ( "abc" != "bca") và trùng lặp trong nội dung của chuỗi chắc chắn được cho phép ( "aaa"có thể tồn tại và != "a").

Tập hợp là tập hợp các phần tử không thể chứa các bản sao và có thứ tự không xác định có thể thay đổi theo thời gian. Các bộ không đại diện cho danh sách các thứ nhiều như chúng mô tả mức độ của một lựa chọn của một số thứ. Cấu trúc bên trong của tập hợp, cách các phần tử của nó được lưu trữ tương đối với nhau, thường không có nghĩa là truyền đạt thông tin hữu ích. Trong một số triển khai, các bộ luôn được sắp xếp bên trong; trong những trường hợp khác, thứ tự đơn giản là không xác định (thường phụ thuộc vào hàm băm).

Bộ sưu tập là một thuật ngữ chung để chỉ bất kỳ đối tượng nào được sử dụng để lưu trữ một số (thường là biến) của các đối tượng khác. Cả danh sách và bộ là một loại bộ sưu tập. Tuples và Mảng thường không được coi là bộ sưu tập. Một số ngôn ngữ coi bản đồ (thùng chứa mô tả các liên kết giữa các đối tượng khác nhau) là một loại bộ sưu tập.

Lược đồ đặt tên này đúng với tất cả các ngôn ngữ lập trình mà tôi biết, bao gồm Python, C ++, Java, C # và Lisp (trong đó danh sách không giữ trật tự của chúng sẽ rất thảm khốc). Nếu bất cứ ai biết đây không phải là trường hợp, xin vui lòng chỉ nói như vậy và tôi sẽ chỉnh sửa câu trả lời của tôi. Lưu ý rằng việc triển khai cụ thể có thể sử dụng các tên khác cho các đối tượng này, chẳng hạn như vectơ trong C ++ và flex trong ALGOL 68 (cả hai danh sách; flex về mặt kỹ thuật chỉ là một mảng có thể thay đổi kích thước).

Nếu có bất kỳ sự nhầm lẫn nào trong trường hợp của bạn do các chi tiết cụ thể về cách thức +hoạt động của dấu hiệu ở đây, chỉ cần biết rằng thứ tự đó rất quan trọng đối với các danh sách và trừ khi có lý do rất chính đáng để tin nếu không bạn có thể luôn luôn cho rằng các hoạt động của danh sách bảo vệ trật tự . Trong trường hợp này, +dấu hiệu này hoạt động giống như đối với các chuỗi (dù sao đây thực sự chỉ là danh sách các ký tự): nó lấy nội dung của một danh sách và đặt nó phía sau nội dung của một chuỗi khác.

Nếu chúng ta có

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

Sau đó

list1 + list2

Giống như

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

Mà đánh giá

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

Nhiều như

"abdcde" + "fghijk"

Sản xuất

"abdcdefghijk"

1
Tôi đã đọc ở đâu đó rằng đặc tả của mảng JSON không chỉ định rằng mảng duy trì các hoạt động của mảng thứ tự không được đảm bảo để duy trì trật tự. Tôi không thể tìm thấy nguồn cho điều đó, mặc dù. Và cấu trúc cơ bản của Mảng vẫn là trường hợp đặc biệt của một đối tượng có chỉ số được đánh số, vì vậy nó không mâu thuẫn với tuyên bố của bạn, chỉ là một mẩu tin thú vị, tôi nghĩ.
Multihunter

1
Tôi không đồng ý với việc giải thích về bộ. Các bộ chắc chắn không "hướng nhiều đến mục đích toán học và lý thuyết hơn các bộ thực tế". Thay vào đó, các bộ rất hữu ích bất cứ khi nào người ta cần một bộ sưu tập chứa các vật phẩm không thể lặp lại và cung cấp các công cụ như sự khác biệt và giao cắt hữu ích trong việc mô hình hóa các trường hợp sử dụng thực tế.
Pintun

1
@Pintun nhìn lại vài năm sau khi viết bài này tôi đồng ý với bạn. Tôi sẽ chỉnh sửa một khi tôi tìm ra cách tốt hơn để thể hiện những gì tôi đang hướng tới.
Tiếp

5

Bạn đang nhầm lẫn 'bộ' và 'danh sách'. Một bộ không đảm bảo trật tự, nhưng danh sách làm.

Các bộ được khai báo bằng dấu ngoặc nhọn : {}. Ngược lại, danh sách được khai báo bằng dấu ngoặc vuông : [].

mySet = {a, b, c, c}

Không đảm bảo trật tự, nhưng danh sách không:

myList = [a, b, c]

1
Lưu ý rằng một bộ cũng đảm bảo không trùng lặp. Một danh sách có thể có các yếu tố trùng lặp, một bộ có thể không.
Nathaniel Ford

4

Tôi cho rằng một điều có thể liên quan đến bạn là liệu các mục có thể thay đổi hay không, ví dụ như 2 trở thành một số khác nhau. Bạn có thể đặt tâm trí của mình thoải mái ở đây, bởi vì trong Python, số nguyên là bất biến , có nghĩa là chúng không thể thay đổi sau khi chúng được tạo.

Không phải tất cả mọi thứ trong Python là bất biến. Ví dụ, danh sách có thể thay đổi --- chúng có thể thay đổi sau khi được tạo. Vì vậy, ví dụ, nếu bạn có một danh sách các danh sách

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

Ở đây, tôi đã thay đổi mục đầu tiên của a(tôi đã thêm 7vào nó). Người ta có thể tưởng tượng việc xáo trộn mọi thứ xung quanh và nhận được những điều bất ngờ ở đây nếu bạn không cẩn thận (và thực tế, điều này xảy ra với mọi người khi họ bắt đầu lập trình bằng Python theo cách này hay cách khác; chỉ cần tìm kiếm trang web này để "sửa đổi danh sách trong khi lặp qua nó "để xem hàng tá ví dụ).

Nó cũng đáng để chỉ ra rằng x = x + [a]x.append(a)không phải là điều tương tự. Cái thứ hai biến đổi x, và cái thứ nhất tạo ra một danh sách mới và gán nó vào x. Để thấy sự khác biệt, hãy thử cài đặt y = xtrước khi thêm bất cứ thứ gì vào xvà thử từng cái, và xem sự khác biệt mà hai người tạo ra y.


0

aList = [1,2,3]

i = 0

for item in aList:  

    if i<2:  

            aList.remove(item)  

    i+=1  

một danh sách

[2]

Đạo đức là khi sửa đổi một danh sách trong một vòng lặp được điều khiển bởi danh sách, thực hiện hai bước:

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

Có danh sách và bộ dữ liệu luôn được sắp xếp trong khi từ điển thì không


1
Ngoại trừ trong Python 3: D
mbeacom
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.