Відповіді:
Хммм. Тут була відповідь із розумінням списку, але вона зникла.
Тут:
[i for i,x in enumerate(testlist) if x == 1]
Приклад:
>>> testlist
[1, 2, 3, 5, 3, 1, 2, 1, 6]
>>> [i for i,x in enumerate(testlist) if x == 1]
[0, 5, 7]
Оновлення:
Гаразд, ви хочете генераторний вираз, у нас буде вираз генератора. Ось знову розуміння списку у циклі for:
>>> for i in [i for i,x in enumerate(testlist) if x == 1]:
... print i
...
0
5
7
Тепер ми побудуємо генератор ...
>>> (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
і досить niftily ми можемо призначити цю змінну і використовувати її звідти ...
>>> gen = (i for i,x in enumerate(testlist) if x == 1)
>>> for i in gen: print i
...
0
5
7
І щоб подумати, я писав FORTRAN.
args = ['x', '-p1', 'v1', '-p2', 'v2']. Потім команда args[[i for i, x in enumerate(args) if x == '-p1'][0] + 1]повертається'v1'
Що з наступного?
print testlist.index(element)
Якщо ви не впевнені, чи шуканий елемент є в списку, ви можете додати попередню перевірку, наприклад
if element in testlist:
print testlist.index(element)
або
print(testlist.index(element) if element in testlist else None)
або "пітонічний шлях", який мені не так подобається, оскільки код менш зрозумілий, але іноді є більш ефективним,
try:
print testlist.index(element)
except ValueError:
pass
ValueError
for i in xrange(len(testlist)):
if testlist[i] == 1:
print i
xrange замість діапазону, як вимагається (див. коментарі).
xrangeвидалено в Python 3.x, оскільки нове range- стареxrange
Ось ще один спосіб зробити це:
try:
id = testlist.index('1')
print testlist[id]
except ValueError:
print "Not Found"
[x for x in range(len(testlist)) if testlist[x]==1]
Спробуйте нижче:
testlist = [1,2,3,5,3,1,2,1,6]
position=0
for i in testlist:
if i == 1:
print(position)
position=position+1
Якщо ваш список отримав достатньо великий розмір, і ви очікували, що це значення знайдеться лише в обмеженій кількості індексів, врахуйте, що цей код може виконуватись набагато швидше, оскільки вам не доведеться повторювати кожне значення списку.
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
Якщо ви очікуєте, що ви знайдете значення багато, вам, ймовірно, слід просто додати "індекс" до списку і надрукувати список в кінці, щоб заощадити час на ітерацію.
Я думаю, що може бути корисним використовувати метод curselection () з бібліотеки Tkinter:
from Tkinter import *
listbox.curselection()
Цей метод працює на віджетах listbox list Tkinter, тому вам потрібно буде сконструювати один із них замість списку.
Це поверне позицію так:
('0',) (хоча пізніші версії Tkinter можуть повернути замість списку вставки)
Яка є для першої позиції, і номер зміниться відповідно до позиції елемента.
Для отримання додаткової інформації дивіться цю сторінку: http://effbot.org/tkinterbook/listbox.htm
Привітання.
Просто, щоб проілюструвати повний приклад разом із тим, input_listякий має searies1(приклад: input_list [0]), у якому потрібно здійснити пошукseries2 (приклад: input_list [1]) та отримати індекси серії2, якщо він існує у серії1.
Примітка. Якщо ви certain conditionбудете прості, умови будуть висловлюватися лямбда
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)
вихід:
[0, 2, 6]