sách gpt4 ăn đã đi

Tại sao tôi thấy "TypeError: chỉ mục chuỗi phải là số nguyên"? (Tại sao tôi thấy "TypeError: chỉ mục chuỗi phải là số nguyên"?)

In lại Tác giả: trợ lý lỗi Thời gian cập nhật: 25-10-2023 22:20:21 32 4
mua khóa gpt4 giày nike



Tôi đang chơi với cả việc học Python và đang cố gắng đưa các vấn đề của GitHub vào dạng dễ đọc. Sử dụng lời khuyên về Làm thế nào để chuyển đổi JSON sang CSV?, Tôi nghĩ ra điều này:

Tôi đang cố gắng học Python và cố gắng đưa các vấn đề về GitHub sang dạng có thể đọc được. Dựa trên những gợi ý về cách chuyển đổi JSON sang CSV, tôi đã đi đến kết luận sau:


nhập json
nhập csv

f = mở('issues.json')
dữ liệu = json.load(f)
f. đóng()

f = mở("issues.csv", "wb+")
csv_file = csv.writer(f)

csv_file.writerow(["gravatar_id", "vị trí", "số", "phiếu bầu", "created_at", "bình luận", "nội dung", "tiêu đề", "cập nhật_at", "html_url", "người dùng", "nhãn", "trạng thái"])

cho mục trong dữ liệu:
csv_file.writerow([item["gravatar_id"], item["position"], item["number"], item["votes"], item["created_at"], item["comments"], item["body"], item["title"], item["updated_at"], item["html_url"], item["user"], item["labels"], item["state"]])

Trong đó "issues.json" là tệp JSON chứa các vấn đề GitHub của tôi. Khi tôi thử chạy tệp đó, tôi nhận được

Trong đó "Issues.json" là tệp JSON chứa các vấn đề về GitHub. Khi tôi cố chạy nó, tôi nhận được


Tệp "foo.py", dòng 14, trong 
csv_file.writerow([item["gravatar_id"], item["position"], item["number"], item["votes"], item["created_at"], item["comments"], item["body"], item["title"], item["updated_at"], item["html_url"], item["user"], item["labels"], item["state"]])

TypeError: chỉ số chuỗi phải là số nguyên

Tôi đang thiếu gì ở đây? "Chỉ số chuỗi" là gì? Tôi chắc chắn rằng khi tôi làm cho nó hoạt động, tôi sẽ gặp nhiều vấn đề hơn, nhưng hiện tại, tôi chỉ muốn nó hoạt động!

Tôi đã bỏ lỡ điều gì à? "chỉ mục chuỗi" là gì? Tôi chắc chắn rằng tôi sẽ có nhiều câu hỏi hơn khi nhận được công việc này, nhưng hiện tại, tôi chỉ yêu công việc này!


Khi tôi điều chỉnh tuyên bố đơn giản

Khi tôi điều chỉnh câu lệnh for thành đơn giản


cho mục trong dữ liệu:
mục in

những gì tôi nhận được là ... "vấn đề" -- vì vậy tôi đang làm sai một điều cơ bản hơn. Đây là một chút nội dung JSON của tôi:

Những gì tôi nhận được là... "vấn đề"--vì vậy tôi đang làm điều gì đó sai về cơ bản hơn. Đây là một số nội dung JSON của tôi:


{"issues": [{"gravatar_id": "44230311a3dcd684b6c5f81bf2ec9f60", "position": 2.0, "number": 263, "votes": 0, "created_at": "17/09/2010 16:06:50 -0700", "comments": 11, "body": "Thêm các liên kết phân trang (Cũ hơn>>) bị thiếu...

khi tôi in dữ liệu, trông giống như nó đang bị nghiền nát một cách kỳ lạ:

Khi tôi in dữ liệu, nó trông rất kỳ lạ:


{u'issues': [{u'body': u'Thêm dòng phân trang bị thiếu (Cũ hơn>>)...

Thêm câu trả lời

Những gì bạn đang thiếu là in repr(dữ liệu) hoặc nhập khẩu in ấn; pprint.pprint(dữ liệu)

Những gì bạn đang thiếu là print epr(Data) hoặc import pprint;pprint t.pprint(Data)

Hãy thử với dấu ngoặc vuông, (ví dụ, data = [json.load(f)] )

Hãy thử sử dụng dấu ngoặc vuông (tức là data=[json.load(F)])

Khuyến nghị câu trả lời tuyệt vời

Biến số mục là một chuỗi. Một chỉ mục trông như thế này:

Mục biến là một chuỗi. Chỉ mục trông như thế này:



>>> mystring = 'helloworld'
>>> in mystring[0]
'h'


Ví dụ trên sử dụng 0 chỉ mục của chuỗi để tham chiếu đến ký tự đầu tiên.

Ví dụ trên sử dụng chỉ số 0 của chuỗi để tham chiếu đến ký tự đầu tiên.



Chuỗi không thể có chỉ mục chuỗi (giống như từ điển). Vì vậy, điều này sẽ không hiệu quả:

Chuỗi không thể có chỉ mục chuỗi (giống như từ điển). Vì vậy, điều này không hoạt động:



>>> mystring = 'helloworld'
>>> in mystring['stringindex']
TypeError: chỉ số chuỗi phải là số nguyên


mục rất có thể là một chuỗi trong mã của bạn; các chỉ số chuỗi là những chỉ số trong dấu ngoặc vuông, ví dụ: gravatar_id. Vì vậy, trước tiên tôi sẽ kiểm tra dữ liệu biến để xem những gì bạn nhận được ở đó; Tôi đoán rằng dữ liệu là danh sách các chuỗi (hoặc ít nhất là danh sách chứa ít nhất một chuỗi) trong khi nó phải là danh sách các từ điển.

Mục rất có thể là một chuỗi trong mã; chỉ mục chuỗi là chỉ mục trong dấu ngoặc vuông, chẳng hạn như gradtalid. Vì vậy, trước tiên tôi sẽ kiểm tra biến dữ liệu của bạn để xem bạn đang nhận được gì ở đó; tôi đoán dữ liệu là một danh sách các chuỗi (hoặc ít nhất là một danh sách chứa một chuỗi), trong khi đó phải là danh sách các từ điển.



LoạiLỗi cho ký hiệu lát cắt chuỗi[a:b]




Trả lời ngắn gọn


Sử dụng một dấu hai chấm : thay vì một dấu phẩy , ở giữa hai chỉ số Mộtb TRONG chuỗi[a:b]:

Sử dụng dấu hai chấm: thay vì dấu phẩy giữa hai chỉ số a và b trong chuỗi [a:b]:


my_string[0,5] # sai ❌
my_string[0:5] # đúng ✅



Câu trả lời dài


Khi làm việc với dây đànký hiệu lát cắt (Một hoạt động trình tự chung), có thể xảy ra trường hợp a LoạiLỗi được nêu ra, chỉ ra rằng các chỉ số phải là số nguyên, ngay cả khi chúng rõ ràng là như vậy.

Khi sử dụng các biểu diễn chuỗi và lát cắt (một thao tác trình tự phổ biến), TypeError có thể xuất hiện cho biết rằng các chỉ mục phải là số nguyên, mặc dù rõ ràng chúng là số nguyên.


Ví dụ


>>> my_string = "Xin chào thế giới!"
>>> chuỗi_của_tôi[0,5]
TypeError: chỉ số chuỗi phải là số nguyên

Rõ ràng là chúng ta đã truyền hai số nguyên cho các chỉ số vào ký hiệu lát cắt, đúng không? Vậy vấn đề ở đây là gì?

Rõ ràng là chúng ta đang chuyển hai số nguyên của chỉ mục sang biểu diễn lát cắt, phải không? Vậy vấn đề ở đây là gì?


Lỗi này có thể rất khó chịu - đặc biệt là khi mới bắt đầu học Python - vì thông báo lỗi có thể gây hiểu lầm đôi chút.

Lỗi này có thể rất khó chịu - đặc biệt là khi bắt đầu học Python - vì thông báo lỗi có phần gây hiểu nhầm.


Giải thích


Chúng tôi đã ngầm thông qua một bộ ba của hai số nguyên đến ký hiệu lát cắt khi chúng ta gọi chuỗi_của_tôi[0,5]. 0,5 đánh giá thành cùng một bộ như (0,5) có - ngay cả khi không có dấu ngoặc đơn. Nhưng tại sao?

Khi chúng ta gọi MY_STRING[0, 5], chúng ta ngầm truyền một bộ gồm hai số nguyên cho biểu diễn lát cắt. 0,5 có giá trị giống với (0,5) -- ngay cả khi không có dấu ngoặc đơn. Nhưng tại sao?


Một dấu phẩy theo sau , thực sự đủ để trình thông dịch Python đánh giá một cái gì đó như một bộ:

Dấu phẩy ở cuối thực sự đủ để yêu cầu trình thông dịch Python đánh giá một mục dưới dạng một bộ dữ liệu:


>>> biến_của_tôi = 0,
>>> kiểu(biến_của_tôi)


Vậy thì lần này chúng tôi đã làm một cách rõ ràng:

Vì vậy, những gì chúng tôi làm ở đây lần này rất rõ ràng:


>>> my_string = "Xin chào thế giới!"
>>> my_tuple = 0, 5
>>> my_string[bộ_của_tôi]
TypeError: chỉ số chuỗi phải là số nguyên

Bây giờ, ít nhất thì thông báo lỗi đã có ý nghĩa.

Bây giờ, ít nhất, thông báo lỗi có ý nghĩa.


Giải pháp


Chúng ta cần phải thay thế dấu phẩy , with a dấu hai chấm : để tách hai số nguyên một cách chính xác, không để chúng được diễn giải như một bộ ba:

Chúng ta cần thay dấu phẩy bằng dấu hai chấm: để phân tách chính xác hai số nguyên thay vì hiểu chúng là bộ dữ liệu:


>>> my_string = "Xin chào thế giới!"
>>> chuỗi_của_tôi[0:5]
'Xin chào'

Một thông báo lỗi rõ ràng và hữu ích hơn có thể như sau:

Thông báo lỗi rõ ràng hơn, hữu ích hơn có thể trông như thế này:


TypeError: chỉ số chuỗi phải là số nguyên chứ không phải là tuple
^^^^^
(loại thực tế ở đây)

Một thông báo lỗi tốt sẽ cho người dùng thấy trực tiếp những gì họ đã làm sai! Với loại thông tin này, sẽ dễ dàng hơn nhiều để tìm ra nguyên nhân gốc rễ và giải quyết vấn đề - và bạn sẽ không phải đến đây.

Một thông báo lỗi tốt sẽ trực tiếp cho người dùng thấy họ đã làm gì sai! Với thông tin như thế này, việc tìm ra nguyên nhân cốt lõi và khắc phục sự cố sẽ dễ dàng hơn nhiều - và bạn không cần phải đến đây.


Vì vậy, lần tới, khi bạn thấy mình chịu trách nhiệm viết thông báo mô tả lỗi, hãy nhắc nhở bản thân về ví dụ này và thêm lý do (hoặc thông tin hữu ích khác) vào thông báo lỗi! Giúp người khác (hoặc thậm chí là chính bạn trong tương lai) hiểu được điều gì đã xảy ra sai.

Vì vậy, lần tới khi bạn thấy mình được giao nhiệm vụ viết một thông báo mô tả lỗi, hãy nhắc nhở bản thân về ví dụ này và thêm lý do (hoặc thông tin hữu ích khác) vào thông báo lỗi! Giúp người khác (thậm chí cả bản thân bạn trong tương lai) hiểu được điều gì đã xảy ra.


Bài học kinh nghiệm



  • ký hiệu lát cắt sử dụng dấu hai chấm : để tách các chỉ số của nó (và phạm vi bước, tức là, str[từ:đến:bước])

  • các bộ được định nghĩa bằng dấu phẩy , (tức là t = 1,)

  • thêm một số thông tin vào thông báo lỗi để người dùng hiểu được điều gì đã xảy ra sai



dữ liệu là một từ điển đối tượng. Vì vậy, hãy lặp lại nó như thế này:

Dữ liệu là một đối tượng DICT. Vì vậy, lặp lại như thế này:



Python 2



đối với khóa, giá trị trong data.iteritems():
in khóa, giá trị


Python 3



đối với khóa, giá trị trong data.items():
in(khóa, giá trị)


Tôi đã gặp vấn đề tương tự với Pandas, bạn cần sử dụng hàm iterrows() để lặp qua tập dữ liệu Pandas Tài liệu Pandas cho iterrows

Tôi gặp vấn đề tương tự khi sử dụng Pandas, bạn cần sử dụng hàm Iterrow() để lặp lại tập dữ liệu Pandas từ tài liệu Pandas.



dữ liệu = pd.read_csv('foo.csv')
đối với chỉ mục, mục trong data.iterrows():
in('{} {}'.format(mục["gravatar_id"], mục["vị trí"]))


Lưu ý rằng bạn cần xử lý chỉ mục trong tập dữ liệu cũng được hàm trả về.

Lưu ý rằng bạn cần xử lý chỉ mục trong tập dữ liệu cũng được hàm này trả về.



Theo nguyên tắc chung, khi tôi nhận được lỗi này trong Python tôi so sánh chữ ký hàm với việc thực hiện hàm.

Theo nguyên tắc chung, khi tôi gặp lỗi này trong Python, tôi so sánh chữ ký hàm với việc thực thi hàm.


Ví dụ:

Ví dụ:


def print_files(danh_sách_tệp, parent_id):
cho tập tin trong file_list:
in(tiêu đề: %s, id: %s' % (tệp['tiêu đề'], tệp['id']

Vì vậy, nếu tôi gọi hàm này với các tham số được đặt theo thứ tự sai và truyền danh sách làm đối số thứ 2 và một chuỗi làm đối số thứ 1:

Vì vậy, nếu tôi gọi hàm này với thứ tự đối số sai và chuyển một danh sách làm đối số thứ hai và một chuỗi làm đối số đầu tiên:


print_files(parent_id, list_of_files) # <----- Vô tình chuyển đổi vị trí đối số

Chức năng này sẽ cố gắng lặp lại qua id_cha mẹ chuỗi thay vì danh sách tập tin và nó sẽ mong đợi thấy chỉ mục là một số nguyên trỏ đến ký tự cụ thể trong chuỗi chứ không phải là một chỉ mục là một chuỗi (tiêu đề hoặc nhận dạng).

Hàm sẽ cố gắng lặp qua chuỗi parent_id chứ không phải danh sách tệp và nó sẽ thấy rằng chỉ mục là một số nguyên trỏ đến một ký tự cụ thể trong chuỗi chứ không phải chỉ mục trong chuỗi (tiêu đề hoặc id).


Điều này sẽ dẫn đến TypeError: chỉ số chuỗi phải là số nguyên lỗi.

Điều này sẽ dẫn đến lỗi TypeError: chỉ mục chuỗi phải là lỗi số nguyên.


Do tính chất động (khác với các ngôn ngữ như Java, C# hoặc Typescript), Python sẽ không thông báo cho bạn về lỗi cú pháp này.

Do tính chất động (trái ngược với các ngôn ngữ như Java, C# hoặc TypeScript), Python sẽ không thông báo cho bạn về lỗi cú pháp này.



Đối với tôi, tôi gặp lỗi này khi tôi cố gắng lấy nhận dạng của mỗi vòng lặp khách hàng ném kết quả trả về bởi hàm lấyClientByPoweruser ;
quên rằng hàm này trả về một đối tượng với thành côngdữ liệu chìa khóa thay vì danh sách mục khách hàng,

Đối với tôi, tôi gặp lỗi này khi cố lấy ID của từng khách hàng, duyệt qua các kết quả được hàm getClientByPoweruser trả về mà quên rằng hàm trả về một đối tượng có khóa thành công và dữ liệu, không phải danh sách dự án khách hàng,


kết quả = chờ getClientByPoweruser(poweruser_id, db)
cho khách hàng trong kết quả:
in(f'id khách hàng:{client["id"]}')

đó là lý do tại sao tôi gặp lỗi:

Đây là lý do tại sao tôi gặp lỗi:


chỉ số chuỗi phải là số nguyên, không phải 'str'

để sửa lỗi này tôi chỉ cần lặp lại kết quả['dữ liệu'] mảng thực sự chứa danh sách khách hàng:

Để khắc phục điều này, tôi chỉ lặp qua mảng kết quả['data'], mảng này thực sự chứa danh sách khách hàng:


cho khách hàng trong kết quả['dữ liệu']: 
in(f'id khách hàng:{client["id"]}')

#kết quả
#ID khách hàng:1
#ID khách hàng:2


Điều này có thể xảy ra nếu thiếu dấu phẩy. Tôi đã gặp phải trường hợp này khi tôi có một danh sách gồm hai bộ, mỗi bộ bao gồm một chuỗi ở vị trí đầu tiên và một danh sách ở vị trí thứ hai. Tôi đã vô tình bỏ sót dấu phẩy sau thành phần đầu tiên của một bộ trong một trường hợp và trình thông dịch nghĩ rằng tôi đang cố gắng lập chỉ mục cho thành phần đầu tiên.

Điều này có thể xảy ra nếu thiếu dấu phẩy. Tôi gặp phải nó khi tôi có một danh sách gồm có hai bộ dữ liệu, mỗi bộ chứa một chuỗi ở vị trí đầu tiên và một danh sách ở vị trí thứ hai. Trong một trường hợp, tôi đã bỏ nhầm dấu phẩy sau thành phần đầu tiên của bộ dữ liệu và trình thông dịch cho rằng tôi đang cố gắng lập chỉ mục cho thành phần đầu tiên.



Chuyển đổi chữ thường thành chữ hoa:

Chuyển chữ thường thành chữ hoa:


str1 = "Xin chào, bạn khỏe không"

new_str = " "

đối với i trong str1:

nếu str1[i].islower():

new_str = new_str + str1[i].upper()

in(new_str)

Lỗi :

sai lầm:



TypeError: chỉ số chuỗi phải là số nguyên



Giải pháp :

Giải pháp:


đối với i trong phạm vi (0, len (str1))
// Sử dụng range khi lặp lại chuỗi.

Thêm câu trả lời

Cần lưu ý rằng đây là lỗi thường phát sinh trong các từ điển lồng nhau khi tác giả quên lồng các câu lệnh gọi đúng cách, ví dụ:mục['findX'] thay vì dict[mục]['findX'] như trong ví dụ đầu tiên bạn đang cố gắng tìm chỉ mục tìmX trong chuỗi/phím mục .. hy vọng điều này có ý nghĩa

Điều đáng chú ý là đây là lỗi thường xảy ra trong các từ điển lồng nhau khi tác giả quên lồng các câu lệnh gọi một cách chính xác. Ví dụ: trong ví dụ đầu tiên, bạn đang cố gắng tìm chỉ mục findX trong một mục chuỗi/từ khóa. Hy vọng điều này có ý nghĩa

Hãy thử sử dụng dấu ngoặc vuông (ví dụ: data = [json.load(f)] ) để lưu trữ các mục json dưới dạng từ điển

Hãy thử lưu trữ các mục json dưới dạng từ điển bằng dấu ngoặc vuông (tức là data=[json.load(F)])

Không rõ bạn đang đề xuất giải pháp gì. Hãy thử sử dụng mã đóng gói phù hợp. Ngoài ra, đối với i trong phạm vi (0, len (x)) thường không phải là cách tốt nhất để viết vòng lặp for

Không rõ giải pháp đề xuất của bạn là gì. Cố gắng sử dụng gói mã thích hợp. Ngoài ra, for i in range(0,len(X)) nói chung không phải là cách tốt nhất để viết vòng lặp for

32 4 0
trợ lý lỗi
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress