Hãy thử điều này thay vì:
for i in xrange(len(data)):
data[i] = "everything"
Vấn đề cơ bản bạn đang gặp phải là khi bạn viết data[i]
, với data
là một danh sách, i
cần phải là một số nguyên, một chỉ số số vào danh sách. Nhưng trong vòng lặp
for item in data
item
là điều thực tế đó là trong danh sách, ví dụ: một chuỗi, không phải là chỉ số số trong những điều. xrange
là một trình lặp mà tạo ra các số thay vì các giá trị trong danh sách, do đó bạn có thể sử dụng nó.
Một thay thế sẽ là
for i, _ in enumerate(data):
data[i] = "everything"
Chức năng enumerate
mang đến cho bạn một iterator qua các bộ dạng (index, item)
, vì vậy tất cả các bạn cần phải làm là lấy chỉ số và quên đi mục. Tôi không chắc chắn rằng cách này hay cách khác (enumerate
hoặc xrange
) sẽ nhanh hơn hoặc tốt hơn đáng kể vì tôi cho rằng danh sách lưu trữ độ dài của chúng trong biến để có thể truy cập nhanh chóng mà không cần đếm qua các yếu tố danh sách.
Tuy nhiên, nếu bạn cần các giá trị danh sách cũ để tính toán giá trị danh sách mới, cách enumerate
có lẽ sẽ nhanh hơn một chút vì bạn tránh làm Python nhìn lên phần tử trong danh sách:
for i, item in enumerate(data):
data[i] = func(item)
loại này điều được thể hiện tốt hơn như một sự hiểu biết danh sách, mặc dù:
data = [func(item) for item in data]
Khi bạn làm điều này, Python sẽ đi qua mỗi mục trong data
, áp dụng các chức năng để nó, và xây dựng một danh sách mới từ các kết quả tự động, vì vậy y Bạn không cần phải lo lắng về việc đưa kết quả của func(item)
vào đúng vị trí trong danh sách. Ví dụ ban đầu của bạn thực sự có thể được thể hiện dưới dạng
data = ["everything" for item in data]
Có vẻ hơi lạ (hoặc workaround), nhưng nó hoạt động một cách chính xác. Tôi không biết rằng các mục ghi đè (trong danh sách) phải được cấp ID của họ. Cảm ơn. –
@ sigo: đó thực sự không phải là một giải pháp nào cả, đó là cách chính xác 100% và hoàn toàn bình thường để thực hiện loại nhiệm vụ này (nhưng lưu ý những gì tôi đã nói về việc hiểu danh sách). –
Trong trường hợp cụ thể này, việc hiểu danh sách có thể được thay thế bằng dữ liệu 'data = [" mọi thứ "nhanh hơn * len (dữ liệu)'. – EOL