Tôi muốn tìm chỉ mục về lần xuất hiện thứ n của một mục trong danh sách. ví dụ:Tìm chỉ mục của mục thứ n trong danh sách
x=[False,True,True,False,True,False,True,False,False,False,True,False,True]
Chỉ số của thực tế là gì? Nếu tôi muốn sự xuất hiện thứ năm (4 nếu zero-lập chỉ mục), câu trả lời là 10.
tôi đã đi lên với:
indargs = [ i for i,a in enumerate(x) if a ]
indargs[n]
Lưu ý rằng x.index
trở sự xuất hiện đầu tiên hoặc sự xuất hiện đầu tiên sau khi một số điểm, và do đó theo như tôi có thể nói không phải là một giải pháp.
Ngoài ra còn có một giải pháp cho các trường hợp tương tự như trên, ví dụ: bằng cách sử dụng cumsum
và where
, nhưng tôi muốn biết liệu có một cách miễn phí không giải quyết được vấn đề không.
Tôi lo ngại về hiệu suất kể từ lần đầu tiên tôi gặp điều này trong khi triển khai Sieve of Eratosthenes cho vấn đề Project Euler, nhưng đây là một câu hỏi chung mà tôi gặp phải trong các tình huống khác.
EDIT: Tôi đã nhận được rất nhiều câu trả lời tuyệt vời, vì vậy tôi đã quyết định thực hiện một số thử nghiệm hiệu suất. Dưới đây là timeit
thời gian thực hiện tính bằng giây đối với các danh sách có len
số lần tìm kiếm sự thật 4000'th/1000'th. Các danh sách là ngẫu nhiên Đúng/Sai. Mã nguồn được liên kết bên dưới; đó là một cảm ứng lộn xộn. Tôi đã sử dụng các phiên bản ngắn/sửa đổi của tên của các áp phích để mô tả các chức năng ngoại trừ listcomp
, đây là danh sách hiểu đơn giản ở trên.
True Test (100'th True in a list containing True/False)
nelements eyquem_occur eyquem_occurrence graddy taymon listcomp hettinger26 hettinger
3000: 0.007824 0.031117 0.002144 0.007694 0.026908 0.003563 0.003563
10000: 0.018424 0.103049 0.002233 0.018063 0.088245 0.003610 0.003769
50000: 0.078383 0.515265 0.002140 0.078074 0.442630 0.003719 0.003608
100000: 0.152804 1.054196 0.002129 0.152691 0.903827 0.003741 0.003769
200000: 0.303084 2.123534 0.002212 0.301918 1.837870 0.003522 0.003601
True Test (1000'th True in a list containing True/False)
nelements eyquem_occur eyquem_occurrence graddy taymon listcomp hettinger26 hettinger
3000: 0.038461 0.031358 0.024167 0.039277 0.026640 0.035283 0.034482
10000: 0.049063 0.103241 0.024120 0.049383 0.088688 0.035515 0.034700
50000: 0.108860 0.516037 0.023956 0.109546 0.442078 0.035269 0.035373
100000: 0.183568 1.049817 0.024228 0.184406 0.906709 0.035135 0.036027
200000: 0.333501 2.141629 0.024239 0.333908 1.826397 0.034879 0.036551
True Test (20000'th True in a list containing True/False)
nelements eyquem_occur eyquem_occurrence graddy taymon listcomp hettinger26 hettinger
3000: 0.004520 0.004439 0.036853 0.004458 0.026900 0.053460 0.053734
10000: 0.014925 0.014715 0.126084 0.014864 0.088470 0.177792 0.177716
50000: 0.766154 0.515107 0.499068 0.781289 0.443654 0.707134 0.711072
100000: 0.837363 1.051426 0.501842 0.862350 0.903189 0.707552 0.706808
200000: 0.991740 2.124445 0.498408 1.008187 1.839797 0.715844 0.709063
Number Test (750'th 0 in a list containing 0-9)
nelements eyquem_occur eyquem_occurrence graddy taymon listcomp hettinger26 hettinger
3000: 0.026996 0.026887 0.015494 0.030343 0.022417 0.026557 0.026236
10000: 0.037887 0.089267 0.015839 0.040519 0.074941 0.026525 0.027057
50000: 0.097777 0.445236 0.015396 0.101242 0.371496 0.025945 0.026156
100000: 0.173794 0.905993 0.015409 0.176317 0.762155 0.026215 0.026871
200000: 0.324930 1.847375 0.015506 0.327957 1.536012 0.027390 0.026657
Giải pháp trình xử lý lặp của trình xử lý hầu như luôn là tốt nhất. Các giải pháp của taymon và graddy là tốt nhất cho hầu hết các tình huống, mặc dù phương pháp đọc danh sách có thể tốt hơn cho các mảng ngắn khi bạn muốn dụ n'th sao cho n cao hoặc danh sách trong đó có ít hơn n lần xuất hiện. Nếu có cơ hội có ít hơn n lần xuất hiện, kiểm tra ban đầu count
sẽ tiết kiệm thời gian. Ngoài ra, graddy là hiệu quả hơn khi tìm kiếm các con số thay vì True/False ... không rõ ràng lý do tại sao. các giải pháp của eyquem về cơ bản tương đương với các giải pháp khác với chi phí cao hơn hoặc ít hơn; eyquem_occur tương đương với dung dịch của taymon, trong khi eyquem_occurrence tương tự như listcomp.
CHỈNH SỬA: Nhận xét trước đó của tôi cho rằng bạn đã đặt một câu hỏi khác, không phải về cú pháp. Lấy làm tiếc. Tôi không có anh chàng Python nhưng nó có vẻ như sẽ có thể đếm đến tuy nhiên nhiều lần bạn muốn với một vòng lặp cho, tăng truy cập của bạn mỗi lần. Encase này trong một vòng lặp while. Vì vậy, trong khi (amountOfTrues
varatis
+1 cho ghi chú nổi bật về so sánh câu trả lời. Lam tôt lăm! –