Câu trả lời:
Hừm. Có một câu trả lời với sự hiểu biết danh sách ở đây, nhưng nó đã biến mất.
Đây:
[i for i,x in enumerate(testlist) if x == 1]
Thí dụ:
>>> testlist
[1, 2, 3, 5, 3, 1, 2, 1, 6]
>>> [i for i,x in enumerate(testlist) if x == 1]
[0, 5, 7]
Cập nhật:
Được rồi, bạn muốn có một biểu thức trình tạo, chúng ta sẽ có một biểu thức trình tạo. Đây là danh sách hiểu một lần nữa, trong một vòng lặp for:
>>> for i in [i for i,x in enumerate(testlist) if x == 1]:
... print i
...
0
5
7
Bây giờ chúng tôi sẽ xây dựng một máy phát điện ...
>>> (i for i,x in enumerate(testlist) if x == 1)
<generator object at 0x6b508>
>>> for i in (i for i,x in enumerate(testlist) if x == 1):
... print i
...
0
5
7
và đủ nhanh chóng, chúng ta có thể gán nó cho một biến và sử dụng nó từ đó ...
>>> gen = (i for i,x in enumerate(testlist) if x == 1)
>>> for i in gen: print i
...
0
5
7
Và để nghĩ rằng tôi đã từng viết FORTRAN.
args = ['x', '-p1', 'v1', '-p2', 'v2']
. Sau đó, lệnh args[[i for i, x in enumerate(args) if x == '-p1'][0] + 1]
trở lại'v1'
Điều gì về sau đây?
print testlist.index(element)
Nếu bạn không chắc chắn liệu phần tử cần tìm có thực sự có trong danh sách hay không, bạn có thể thêm kiểm tra sơ bộ, như
if element in testlist:
print testlist.index(element)
hoặc là
print(testlist.index(element) if element in testlist else None)
hoặc "cách pythonic", điều mà tôi không thích lắm vì mã không rõ ràng, nhưng đôi khi hiệu quả hơn,
try:
print testlist.index(element)
except ValueError:
pass
ValueError
for i in xrange(len(testlist)):
if testlist[i] == 1:
print i
xrange thay vì phạm vi theo yêu cầu (xem bình luận).
xrange
bị mất trong Python 3.x, vì cái mới range
là cũxrange
Đây là một cách khác để làm điều này:
try:
id = testlist.index('1')
print testlist[id]
except ValueError:
print "Not Found"
[x for x in range(len(testlist)) if testlist[x]==1]
Hãy thử dưới đây:
testlist = [1,2,3,5,3,1,2,1,6]
position=0
for i in testlist:
if i == 1:
print(position)
position=position+1
Nếu danh sách của bạn đủ lớn và bạn chỉ mong tìm thấy giá trị trong một số chỉ số thưa thớt, hãy xem xét rằng mã này có thể thực thi nhanh hơn nhiều vì bạn không phải lặp lại mọi giá trị trong danh sách.
lookingFor = 1
i = 0
index = 0
try:
while i < len(testlist):
index = testlist.index(lookingFor,i)
i = index + 1
print index
except ValueError: #testlist.index() cannot find lookingFor
pass
Nếu bạn muốn tìm thấy giá trị rất nhiều, có lẽ bạn chỉ nên thêm "chỉ mục" vào danh sách và in danh sách ở cuối để tiết kiệm thời gian cho mỗi lần lặp.
Tôi nghĩ rằng có thể hữu ích khi sử dụng phương thức curselection () từ thư viện thte Tkinter:
from Tkinter import *
listbox.curselection()
Phương pháp này hoạt động trên các tiện ích hộp danh sách Tkinter, vì vậy bạn sẽ cần xây dựng một trong số chúng thay vì danh sách.
Điều này sẽ trả về một vị trí như thế này:
('0',) (mặc dù các phiên bản sau của Tkinter có thể trả về danh sách các số nguyên thay thế)
Đó là cho vị trí đầu tiên và số lượng sẽ thay đổi theo vị trí mục.
Để biết thêm thông tin, xem trang này: http://effbot.org/tkinterbook/listbox.htm
Lời chào hỏi.
Chỉ để minh họa ví dụ hoàn chỉnh cùng với input_list
cái có searies1
(ví dụ: input_list [0]) mà bạn muốn thực hiện tra cứu series2
(ví dụ: input_list [1]) và lấy các chỉ mục của sê-ri 2 nếu nó tồn tại trong sê-ri1.
Lưu ý: Bạn certain condition
sẽ chuyển sang biểu thức lambda nếu điều kiện đơn giản
input_list = [[1,2,3,4,5,6,7],[1,3,7]]
series1 = input_list[0]
series2 = input_list[1]
idx_list = list(map(lambda item: series1.index(item) if item in series1 else None, series2))
print(idx_list)
đầu ra:
[0, 2, 6]