Yanıtlar:
Hmmm. Burada liste kavrayışı olan bir cevap vardı, ama kayboldu.
Buraya:
[i for i,x in enumerate(testlist) if x == 1]
Misal:
>>> testlist
[1, 2, 3, 5, 3, 1, 2, 1, 6]
>>> [i for i,x in enumerate(testlist) if x == 1]
[0, 5, 7]
Güncelleme:
Tamam, bir jeneratör ifadesi istiyorsunuz, bir jeneratör ifademiz olacak. İşte liste kavrayışı, bir for döngüsü içinde:
>>> for i in [i for i,x in enumerate(testlist) if x == 1]:
... print i
...
0
5
7
Şimdi bir jeneratör inşa edeceğiz ...
>>> (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
ve niftly, bunu bir değişkene atayabilir ve oradan kullanabiliriz ...
>>> gen = (i for i,x in enumerate(testlist) if x == 1)
>>> for i in gen: print i
...
0
5
7
Ve eskiden FORTRAN yazdığımı düşünüyordum.
args = ['x', '-p1', 'v1', '-p2', 'v2']
. Sonra komut args[[i for i, x in enumerate(args) if x == '-p1'][0] + 1]
geri döner'v1'
Aşağıdakiler ne olacak?
print testlist.index(element)
Aranacak öğenin listede olup olmadığından emin değilseniz, aşağıdaki gibi bir ön kontrol ekleyebilirsiniz.
if element in testlist:
print testlist.index(element)
veya
print(testlist.index(element) if element in testlist else None)
veya kodun daha az net olduğu, ancak bazen daha verimli olduğu için çok sevmediğim "pitonik yol"
try:
print testlist.index(element)
except ValueError:
pass
ValueError
for i in xrange(len(testlist)):
if testlist[i] == 1:
print i
istendiği gibi aralık yerine xrange (yorumlara bakın).
xrange
Python 3.x'te, range
eski eskidirxrange
İşte bunu yapmanın başka bir yolu:
try:
id = testlist.index('1')
print testlist[id]
except ValueError:
print "Not Found"
[x for x in range(len(testlist)) if testlist[x]==1]
Aşağıdakileri deneyin:
testlist = [1,2,3,5,3,1,2,1,6]
position=0
for i in testlist:
if i == 1:
print(position)
position=position+1
Listeniz yeterince genişlediyse ve değeri yalnızca az sayıda endekste bulmayı beklediyseniz, listedeki her değeri tekrarlamak zorunda olmadığınız için bu kodun çok daha hızlı çalışabileceğini düşünün .
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
Değeri çok bulmayı bekliyorsanız, muhtemelen bir listeye "index" eklemeniz ve yineleme başına zaman kazanmak için en sonunda listeyi yazdırmanız gerekir.
Tkinter kütüphanesinden curselection () yöntemini kullanmanın yararlı olabileceğini düşünüyorum:
from Tkinter import *
listbox.curselection()
Bu yöntem Tkinter liste kutusu widget'larında çalışır, bu nedenle bir liste yerine bunlardan birini oluşturmanız gerekir.
Bu, aşağıdaki gibi bir konum döndürür:
('0',) (Tkinter'in sonraki sürümleri bunun yerine bir ints listesi döndürebilir)
Hangi ilk pozisyon için ve sayı madde konumuna göre değişecektir.
Daha fazla bilgi için bu sayfaya bakın: http://effbot.org/tkinterbook/listbox.htm
Selamlar.
Sadece birlikte eksiksiz bir örnek göstermek için input_list
vardır searies1
(örneğin: input_list [0]) Eğer bir arama yapmak istediğiniz series2
(örneğin: input_list [1]) ve SERIES1 bulunuyorsa SERIES2 indeksleri olsun.
Not: certain condition
Koşullar basitse lambda ifadesine girersiniz
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)
çıktı:
[0, 2, 6]