Odpowiedzi:
Hmmm. Była tu odpowiedź ze zrozumieniem listy, ale zniknęła.
Tutaj:
[i for i,x in enumerate(testlist) if x == 1]
Przykład:
>>> testlist
[1, 2, 3, 5, 3, 1, 2, 1, 6]
>>> [i for i,x in enumerate(testlist) if x == 1]
[0, 5, 7]
Aktualizacja:
OK, potrzebujesz wyrażenia generatora, będziemy mieć wyrażenie generatora. Oto ponownie rozumienie listy, w pętli for:
>>> for i in [i for i,x in enumerate(testlist) if x == 1]:
... print i
...
0
5
7
Teraz skonstruujemy generator ...
>>> (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
i dość sprytnie, możemy przypisać to do zmiennej i używać jej stamtąd ...
>>> gen = (i for i,x in enumerate(testlist) if x == 1)
>>> for i in gen: print i
...
0
5
7
I pomyśleć, że pisałem FORTRAN.
args = ['x', '-p1', 'v1', '-p2', 'v2']. Następnie polecenie args[[i for i, x in enumerate(args) if x == '-p1'][0] + 1]powraca'v1'
A co z następującymi?
print testlist.index(element)
Jeśli nie jesteś pewien, czy element, którego szukasz, faktycznie znajduje się na liście, możesz dodać wstępne sprawdzenie, na przykład
if element in testlist:
print testlist.index(element)
lub
print(testlist.index(element) if element in testlist else None)
lub „sposób pythonowy”, którego nie lubię tak bardzo, ponieważ kod jest mniej przejrzysty, ale czasami jest bardziej wydajny,
try:
print testlist.index(element)
except ValueError:
pass
ValueError
for i in xrange(len(testlist)):
if testlist[i] == 1:
print i
xrange zamiast zakresu zgodnie z żądaniem (patrz komentarze).
xrangejest dezaktywowany w Pythonie 3.x, ponieważ nowy rangejest staryxrange
Oto inny sposób, aby to zrobić:
try:
id = testlist.index('1')
print testlist[id]
except ValueError:
print "Not Found"
[x for x in range(len(testlist)) if testlist[x]==1]
Wypróbuj poniższe:
testlist = [1,2,3,5,3,1,2,1,6]
position=0
for i in testlist:
if i == 1:
print(position)
position=position+1
Jeśli twoja lista jest wystarczająco duża i spodziewałeś się znaleźć wartość tylko w rzadkiej liczbie indeksów, weź pod uwagę, że ten kod może działać znacznie szybciej, ponieważ nie musisz iterować każdej wartości na liście.
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
Jeśli spodziewasz się, że znajdziesz dużo wartości, prawdopodobnie powinieneś po prostu dodać „index” do listy i wydrukować listę na końcu, aby zaoszczędzić czas na iterację.
Myślę, że przydałoby się użycie metody curselection () z biblioteki Tkinter:
from Tkinter import *
listbox.curselection()
Ta metoda działa na widżetach listbox Tkinter, więc musisz utworzyć jeden z nich zamiast listy.
Spowoduje to zwrócenie takiej pozycji:
('0',) (chociaż późniejsze wersje Tkintera mogą zamiast tego zwracać listę int)
Która dotyczy pierwszej pozycji, a liczba będzie się zmieniać w zależności od pozycji pozycji.
Więcej informacji można znaleźć na tej stronie: http://effbot.org/tkinterbook/listbox.htm
Pozdrowienia.
Aby zilustrować kompletny przykład wraz z tym, input_listktóry ma searies1(przykład: lista_wejściowa [0]), w którym chcesz series2wyszukać (przykład: lista_wejściowa [1]) i uzyskać indeksy serii2, jeśli istnieje w serii1.
Uwaga: Twoja certain conditionwola zostanie wyrażona w wyrażeniu lambda, jeśli warunki są proste
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)
wynik:
[0, 2, 6]