Python có lập chỉ mục ở mức 0 hay 1 không?

Tôi đã được hỏi trên Twitter tại sao Python sử dụng lập chỉ mục dựa trên 0, với một liên kết đến một bài đăng mới [hấp dẫn] về chủ đề này [http. //ví dụ. tích cực. org/blarg/2013/10/22/cần dẫn nguồn/]. Tôi nhớ đã nghĩ về nó rất nhiều; . Một vài ngôn ngữ lập trình đầu tiên của tôi [Algol, Fortran, Pascal] đã sử dụng dựa trên 1 hoặc dựa trên biến. Tôi nghĩ rằng một trong những vấn đề đã giúp tôi quyết định là ký hiệu lát cắt

Trước tiên hãy xem xét các trường hợp sử dụng. Có lẽ các trường hợp sử dụng phổ biến nhất để cắt là "lấy n mục đầu tiên" và "lấy n mục tiếp theo bắt đầu từ i" [trường hợp đầu tiên là trường hợp đặc biệt cho i == chỉ mục đầu tiên]. Sẽ thật tuyệt nếu cả hai điều này có thể được thể hiện mà không có phần bù +1 hoặc -1 khó xử

Sử dụng lập chỉ mục dựa trên 0, khoảng thời gian nửa mở và giá trị mặc định phù hợp [như Python cuối cùng đã có], chúng rất đẹp. Một[. n] và a[i. i+n]; . N]

Sử dụng lập chỉ mục dựa trên 1, nếu bạn muốn [. n] có nghĩa là n phần tử đầu tiên, bạn phải sử dụng các khoảng đóng hoặc bạn có thể sử dụng ký hiệu lát cắt sử dụng bắt đầu và độ dài làm tham số lát cắt. Sử dụng các khoảng thời gian nửa mở không đẹp lắm khi kết hợp với lập chỉ mục dựa trên 1. Sử dụng các khoảng đóng, bạn phải viết a[i. i+n-1] cho n mục bắt đầu từ i. Vì vậy, có lẽ sử dụng chiều dài lát cắt sẽ thanh lịch hơn với lập chỉ mục dựa trên 1? . N]. Và đây thực tế là những gì ABC đã làm -- nó sử dụng một ký hiệu khác để bạn có thể viết a@i. n. [Xem http. //trang chủ. cwi. nl/~steven/abc/qr. html#EXPRESSIONS. ]

Nhưng làm thế nào để chỉ mục. quy ước độ dài phù hợp với các trường hợp sử dụng khác? . Đặc biệt là bất biến khi hai lát liền kề nhau, chỉ số kết thúc của lát đầu tiên là chỉ số bắt đầu của lát thứ hai, quá đẹp để bỏ qua. Ví dụ: giả sử bạn chia một chuỗi thành ba phần tại các chỉ số i và j -- các phần đó sẽ là a[. tôi], một [tôi. j] và a[j. ]

Vì vậy, đó là lý do tại sao Python sử dụng lập chỉ mục dựa trên 0

Trong bài học này, bạn sẽ thấy cách truy cập các phần tử riêng lẻ và chuỗi các đối tượng trong danh sách của mình. Các phần tử danh sách có thể được truy cập bằng cách sử dụng một chỉ mục số trong ngoặc vuông

>>>

>>> mylist[m]

Đây là kỹ thuật tương tự được sử dụng để truy cập các ký tự riêng lẻ trong một chuỗi. Lập chỉ mục danh sách cũng dựa trên số không

>>>

>>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']

>>> a[0]
'spam'
>>> a[2]
'bacon'
>>> a[5]
'lobster'
>>> a[len[a]-1]
'lobster'
>>> a[6]
Traceback [most recent call last]:
  File "", line 1, in 
    a[6]
IndexError: list index out of range

Các phần tử danh sách cũng có thể được truy cập bằng cách sử dụng chỉ mục danh sách phủ định, được tính từ cuối danh sách

>>>

>>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']

>>> a[-1]
'lobster'
>>> a[-2]
'ham'
>>> a[-5]
'egg'
>>> a[-6]
'spam'
>>> a[-len[a]]
'spam'
>>> a[-8]
Traceback [most recent call last]:
  File "", line 1, in 
    a[-8]
IndexError: list index out of range

Cắt lát là cú pháp lập chỉ mục trích xuất một phần từ danh sách. Nếu

>>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']

>>> a[0]
'spam'
>>> a[2]
'bacon'
>>> a[5]
'lobster'
>>> a[len[a]-1]
'lobster'
>>> a[6]
Traceback [most recent call last]:
  File "", line 1, in 
    a[6]
IndexError: list index out of range
9 là một danh sách, thì
>>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']

>>> a[-1]
'lobster'
>>> a[-2]
'ham'
>>> a[-5]
'egg'
>>> a[-6]
'spam'
>>> a[-len[a]]
'spam'
>>> a[-8]
Traceback [most recent call last]:
  File "", line 1, in 
    a[-8]
IndexError: list index out of range
0 trả về phần của
>>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']

>>> a[0]
'spam'
>>> a[2]
'bacon'
>>> a[5]
'lobster'
>>> a[len[a]-1]
'lobster'
>>> a[6]
Traceback [most recent call last]:
  File "", line 1, in 
    a[6]
IndexError: list index out of range
9

  • Bắt đầu với tư thế
    >>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
    
    >>> a[-1]
    'lobster'
    >>> a[-2]
    'ham'
    >>> a[-5]
    'egg'
    >>> a[-6]
    'spam'
    >>> a[-len[a]]
    'spam'
    >>> a[-8]
    Traceback [most recent call last]:
      File "", line 1, in 
        a[-8]
    IndexError: list index out of range
    
    2
  • Tối đa nhưng không bao gồm
    >>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
    
    >>> a[-1]
    'lobster'
    >>> a[-2]
    'ham'
    >>> a[-5]
    'egg'
    >>> a[-6]
    'spam'
    >>> a[-len[a]]
    'spam'
    >>> a[-8]
    Traceback [most recent call last]:
      File "", line 1, in 
        a[-8]
    IndexError: list index out of range
    
    3
  • Lập chỉ mục tiêu cực cũng có thể được sử dụng

Đây là một ví dụ

>>>

>>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a[2:5]
['bacon', 'tomato', 'ham']
>>> a[-5:-2]
['egg', 'bacon', 'tomato']
>>> a[1:4]
['egg', 'bacon', 'tomato']
>>> a[-5:-2] == a[1:4]
True

Bỏ qua chỉ mục đầu tiên và/hoặc cuối cùng

  • Bỏ qua chỉ mục đầu tiên
    >>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
    
    >>> a[-1]
    'lobster'
    >>> a[-2]
    'ham'
    >>> a[-5]
    'egg'
    >>> a[-6]
    'spam'
    >>> a[-len[a]]
    'spam'
    >>> a[-8]
    Traceback [most recent call last]:
      File "", line 1, in 
        a[-8]
    IndexError: list index out of range
    
    4 bắt đầu lát cắt ở đầu danh sách
  • Việc bỏ qua chỉ mục cuối cùng
    >>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
    
    >>> a[-1]
    'lobster'
    >>> a[-2]
    'ham'
    >>> a[-5]
    'egg'
    >>> a[-6]
    'spam'
    >>> a[-len[a]]
    'spam'
    >>> a[-8]
    Traceback [most recent call last]:
      File "", line 1, in 
        a[-8]
    IndexError: list index out of range
    
    5 sẽ mở rộng lát cắt từ chỉ mục đầu tiên
    >>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
    
    >>> a[-1]
    'lobster'
    >>> a[-2]
    'ham'
    >>> a[-5]
    'egg'
    >>> a[-6]
    'spam'
    >>> a[-len[a]]
    'spam'
    >>> a[-8]
    Traceback [most recent call last]:
      File "", line 1, in 
        a[-8]
    IndexError: list index out of range
    
    2 đến cuối danh sách
  • Bỏ qua cả hai chỉ mục
    >>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
    
    >>> a[-1]
    'lobster'
    >>> a[-2]
    'ham'
    >>> a[-5]
    'egg'
    >>> a[-6]
    'spam'
    >>> a[-len[a]]
    'spam'
    >>> a[-8]
    Traceback [most recent call last]:
      File "", line 1, in 
        a[-8]
    IndexError: list index out of range
    
    7 trả về một bản sao của toàn bộ danh sách, nhưng không giống như một chuỗi, đó là một bản sao, không phải là một tham chiếu đến cùng một đối tượng

Đây là một ví dụ

>>>

>>> a
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a[:4]
['spam', 'egg', 'bacon', 'tomato']
>>> a[0:4]
['spam', 'egg', 'bacon', 'tomato']
>>> a[2:]
['bacon', 'tomato', 'ham', 'lobster']
>>> a[2:len[a]]
['bacon', 'tomato', 'ham', 'lobster']

>>> a
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a[:]
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a == a[:]
True
>>> a is a[:]
False

>>> s = 'mybacon'
>>> s[:]
'mybacon'
>>> s == s[:]
True
>>> s is s[:]
True

Một bước tiến có thể được thêm vào ký hiệu lát cắt của bạn. Sử dụng một

>>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']

>>> a[-1]
'lobster'
>>> a[-2]
'ham'
>>> a[-5]
'egg'
>>> a[-6]
'spam'
>>> a[-len[a]]
'spam'
>>> a[-8]
Traceback [most recent call last]:
  File "", line 1, in 
    a[-8]
IndexError: list index out of range
8 bổ sung và một chỉ số thứ ba chỉ định một sải chân [còn gọi là một bước] trong ký hiệu lát cắt của bạn. Sải bước có thể là tích cực hoặc tiêu cực

>>>

>>> a
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a[0:6:2]
['spam', 'bacon', 'ham']
>>> a[1:6:2]
['egg', 'tomato', 'lobster']
>>> a[6:0:-2]
['lobster', 'tomato', 'egg']
>>> a
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a[::-1]
['lobster', 'ham', 'tomato', 'bacon', 'egg', 'spam']

JulianV trên

Đẹp

Orlando Uribe trên

Cảm ơn vì tài liệu này. Tôi đoán có một lỗi đánh máy [??] trong một trong những ví dụ được viết theo bước tiến [ví dụ video là OK]

lỗi đánh máy

>>> a[0:6:-2]
['lobster', 'tomato, 'egg']

phát biểu đúng phải là

>>> a[6:0:-2]
['lobster', 'tomato, 'egg']

nếu không thì,

>>> a[0:6:-2]
[]

Chris Bailey Nhóm RP trên

Xin chào @Orlando Uribe, Bạn nói đúng, tôi sẽ thay đổi nó để phù hợp với bài học trong video. Cảm ơn

Ajay trên

@chris Video rất nhiều thông tin, cảm ơn vì điều này. Khi tôi đang thực hành các ví dụ, có một nghi ngờ

In [43]: a = [9, 1, 2, 4, 5, 6, 8]

In [44]: a[6:0:-2]
Out[44]: [8, 5, 2]

Với sải chân âm tại sao không bao gồm 9

Nó có loại trừ giá trị cuối cùng không?

Chris Bailey Nhóm RP trên

Xin chào @Ajay,

Cảm ơn đã xem khóa học. Lát bạn đã tạo sẽ bắt đầu ở chỉ mục 6 và kết thúc ở chỉ mục 1 và không bao gồm chỉ mục 0, đó là lý do tại sao bạn không nhận được chỉ mục 0 trên 9. Nếu bạn đã sử dụng

>>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']

>>> a[0]
'spam'
>>> a[2]
'bacon'
>>> a[5]
'lobster'
>>> a[len[a]-1]
'lobster'
>>> a[6]
Traceback [most recent call last]:
  File "", line 1, in 
    a[6]
IndexError: list index out of range
0

Điều đó sẽ bao gồm chỉ số 0. Tôi hy vọng điều này sẽ giúp giải thích những gì đang xảy ra. Dẫn lại từ văn bản dưới bài học

Cắt lát là cú pháp lập chỉ mục trích xuất một phần từ danh sách. Nếu

>>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']

>>> a[0]
'spam'
>>> a[2]
'bacon'
>>> a[5]
'lobster'
>>> a[len[a]-1]
'lobster'
>>> a[6]
Traceback [most recent call last]:
  File "", line 1, in 
    a[6]
IndexError: list index out of range
9 là một danh sách, thì
>>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']

>>> a[-1]
'lobster'
>>> a[-2]
'ham'
>>> a[-5]
'egg'
>>> a[-6]
'spam'
>>> a[-len[a]]
'spam'
>>> a[-8]
Traceback [most recent call last]:
  File "", line 1, in 
    a[-8]
IndexError: list index out of range
0 trả về phần của
>>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']

>>> a[0]
'spam'
>>> a[2]
'bacon'
>>> a[5]
'lobster'
>>> a[len[a]-1]
'lobster'
>>> a[6]
Traceback [most recent call last]:
  File "", line 1, in 
    a[6]
IndexError: list index out of range
9

  • Bắt đầu với tư thế
    >>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
    
    >>> a[-1]
    'lobster'
    >>> a[-2]
    'ham'
    >>> a[-5]
    'egg'
    >>> a[-6]
    'spam'
    >>> a[-len[a]]
    'spam'
    >>> a[-8]
    Traceback [most recent call last]:
      File "", line 1, in 
        a[-8]
    IndexError: list index out of range
    
    2
  • Tối đa nhưng không bao gồm
    >>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
    
    >>> a[-1]
    'lobster'
    >>> a[-2]
    'ham'
    >>> a[-5]
    'egg'
    >>> a[-6]
    'spam'
    >>> a[-len[a]]
    'spam'
    >>> a[-8]
    Traceback [most recent call last]:
      File "", line 1, in 
        a[-8]
    IndexError: list index out of range
    
    3

Ajay trên

@chris cảm ơn vì đã làm rõ

kiran trên

>>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']

>>> a[0]
'spam'
>>> a[2]
'bacon'
>>> a[5]
'lobster'
>>> a[len[a]-1]
'lobster'
>>> a[6]
Traceback [most recent call last]:
  File "", line 1, in 
    a[6]
IndexError: list index out of range
1

Tại sao nó trả về chuỗi rỗng? . Bạn có thể cho tôi rõ ràng nhất về điều này?

>>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']

>>> a[0]
'spam'
>>> a[2]
'bacon'
>>> a[5]
'lobster'
>>> a[len[a]-1]
'lobster'
>>> a[6]
Traceback [most recent call last]:
  File "", line 1, in 
    a[6]
IndexError: list index out of range
2

kiran trên

Giá trị sẽ là

In [43]: a = [9, 1, 2, 4, 5, 6, 8]

In [44]: a[6:0:-2]
Out[44]: [8, 5, 2]
9

Bartosz Zaczyński Nhóm RP trên

Hãy nghĩ về các chỉ số âm như một ký hiệu tốc ký để trừ đi độ dài chuỗi đã cho

>>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']

>>> a[0]
'spam'
>>> a[2]
'bacon'
>>> a[5]
'lobster'
>>> a[len[a]-1]
'lobster'
>>> a[6]
Traceback [most recent call last]:
  File "", line 1, in 
    a[6]
IndexError: list index out of range
3

Các chỉ số tiêu cực trong ví dụ “hello world” của bạn sẽ chuyển thành điều này

>>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']

>>> a[0]
'spam'
>>> a[2]
'bacon'
>>> a[5]
'lobster'
>>> a[len[a]-1]
'lobster'
>>> a[6]
Traceback [most recent call last]:
  File "", line 1, in 
    a[6]
IndexError: list index out of range
4

Bạn đang nhận được một chuỗi trống vì chỉ số bên trái cao hơn chỉ số bên phải, trong khi bạn chưa chỉ ra thứ tự đảo ngược với đối số "bước" thứ ba. Nếu bạn đã làm, đây là bạn sẽ nhận được

>>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']

>>> a[0]
'spam'
>>> a[2]
'bacon'
>>> a[5]
'lobster'
>>> a[len[a]-1]
'lobster'
>>> a[6]
Traceback [most recent call last]:
  File "", line 1, in 
    a[6]
IndexError: list index out of range
5

Bạn có thể lấy các chỉ số kết quả được sử dụng bởi vòng lặp bên dưới như thế này

>>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']

>>> a[0]
'spam'
>>> a[2]
'bacon'
>>> a[5]
'lobster'
>>> a[len[a]-1]
'lobster'
>>> a[6]
Traceback [most recent call last]:
  File "", line 1, in 
    a[6]
IndexError: list index out of range
6

Nó trả về một bộ mà bạn có thể giải nén và chuyển đến hàm

>>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']

>>> a[0]
'spam'
>>> a[2]
'bacon'
>>> a[5]
'lobster'
>>> a[len[a]-1]
'lobster'
>>> a[6]
Traceback [most recent call last]:
  File "", line 1, in 
    a[6]
IndexError: list index out of range
00

>>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']

>>> a[0]
'spam'
>>> a[2]
'bacon'
>>> a[5]
'lobster'
>>> a[len[a]-1]
'lobster'
>>> a[6]
Traceback [most recent call last]:
  File "", line 1, in 
    a[6]
IndexError: list index out of range
7

Đây là các chỉ số được sử dụng bởi cú pháp dấu ngoặc vuông

kiran trên

Rực rỡ @Bartosz Zaczyński. Cảm ơn

mo on

Tôi vui vẻ bắt đầu sử dụng bpython; . Thử tất cả mọi thứ. Và nhiều hơn nữa. ] Làm điều đó tôi gặp phải điều này

Python lập chỉ mục từ 0 hay 1?

Python sử dụng lập chỉ mục dựa trên số không . Điều đó có nghĩa là, phần tử đầu tiên [giá trị 'đỏ'] có chỉ số 0, phần tử thứ hai [giá trị 'xanh lá cây'] có chỉ số 1, v.v.

0 được lập chỉ mục hay 1 được lập chỉ mục?

Lập chỉ mục mảng dựa trên 0 là một cách đánh số các mục trong một mảng sao cho mục đầu tiên của nó có chỉ mục là 0, trong khi mảng được lập chỉ mục của mảng một cơ sở có mục đầu tiên của nó được lập chỉ mục là 1

Chủ Đề