





for i in xrange(len(testlist)):
if testlist[i] == 1:
print i
xrange вместо диапазона по запросу (см. комментарии).
Я согласен на большие списки в программах на Python 2. Обратите внимание, что «диапазон» по-прежнему будет работать в python 3 (и работать как xrange IIRC). xrange идет по пути динозавров.
Обновление: xrange изменен в Python 3.x, так как новый range - это старый xrange
Используйте enumerate:
testlist = [1,2,3,5,3,1,2,1,6]
for position, item in enumerate(testlist):
if item == 1:
print position
Если ваш список стал достаточно большим и вы ожидали найти значение только в небольшом количестве индексов, учтите, что этот код мог выполняется намного быстрее, потому что вам не нужно повторять каждое значение в списке.
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
Если вы ожидаете найти значение много, вам, вероятно, следует просто добавить «index» к списку и распечатать список в конце, чтобы сэкономить время на итерацию.
Я сделал несколько тестов на время. Техника понимания списка работает на 38% быстрее, чем этот код. (Я заменил ваш оператор печати вызовом outputlist.append)
Я также провел несколько тестов с размером списка из 100000 случайных значений от 1 до 100. Написанный мной код был в некоторых случаях в два раза быстрее. Никакое временное тестирование не сравнимо с приложением плаката (разумеется, они должны сами себя тестировать). Прошу прощения, если мое мнение нанесло ущерб этому посту.
Хм. Здесь был ответ с пониманием списка, но он исчез.
Здесь:
[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
и достаточно изящно, мы можем присвоить это переменной и использовать оттуда ...
>>> gen = (i for i,x in enumerate(testlist) if x == 1)
>>> for i in gen: print i
...
0
5
7
Подумать только, я писал ФОРТРАН.
Это лучший ответ, ИМО. Он ясен и лаконичен, и вы фактически фиксируете значения индекса, поэтому он расширяемый (вы можете распечатать их, передать их другой функции и т. д.). Единственное улучшение - использовать выражение генератора для случаев с большим количеством совпадений. is.gd/brzl
После, наверное, 25 лет сомнений в функциональном программировании, я думаю, что наконец понял. понимание списка просто бомба.
Переменные, состоящие из одного слова, затрудняют понимание вашего кода, особенно в примерах программирования.
Я предполагаю, что вы имеете в виду «одну букву» и, честно говоря, более длинное имя в этом примере не будет иметь больше информационного содержания.
Спасибо за отличный ответ. Я думаю, что комментарий @nailer может относиться к тому факту, что вы используете «i» в двух разных контекстах в одной строке в примере генератора; один внутри понимания, а другой - для его перебора. Я знаю, это на секунду сбило меня с толку.
@CharlieMartin Вы используете 'i' для индекса, а не для элемента в соответствии с одним общим соглашением для односимвольных переменных. Присвоение имени индексу index и элемента item устранит двусмысленность. Кроме того, вы отвечаете родителю, который использовал «элемент» и «положение», и это хороший способ не переименовывать без необходимости части исходного кода в своем ответе.
Хм. В каждом случае i за пределами понимания списка или генератора - это именно то, что собрано как i внутри. Было бы странно иметь для него два разных названия.
Супер-синтаксис: o) Вы можете легко получить параметр командной строки. Пусть есть массив аргументов: args = ['x', '-p1', 'v1', '-p2', 'v2']. Затем команда args[[i for i, x in enumerate(args) if x == '-p1'][0] + 1] возвращает 'v1'
testlist = [1,2,3,5,3,1,2,1,6]
for id, value in enumerate(testlist):
if id == 1:
print testlist[id]
Я думаю, это именно то, что вам нужно. ;-) id всегда будет индексом значений в списке.
Вот еще один способ сделать это:
try:
id = testlist.index('1')
print testlist[id]
except ValueError:
print "Not Found"
А как насчет следующего?
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
Я думаю, что он хочет найти все вхождения, вы, кажется, даете только первое.
@tfv Я не понимаю, как вы можете прийти к такому выводу, ведь в вопросе написано «item», а не «items».
[x for x in range(len(testlist)) if testlist[x]==1]
Думаю, было бы полезно использовать метод curselection () из библиотеки Tkinter:
from Tkinter import *
listbox.curselection()
Этот метод работает с виджетами списка Tkinter, поэтому вам нужно будет создать один из них вместо списка.
Это вернет такую позицию:
('0',) (хотя более поздние версии Tkinter могут вместо этого возвращать список целых чисел)
Это для первой позиции, и число будет меняться в зависимости от позиции элемента.
Для получения дополнительной информации см. Эту страницу: http://effbot.org/tkinterbook/listbox.htm
Привет.
Интересная идея. Однако, поскольку для этого требуется импортировать всю библиотеку Tkinter, это не самый эффективный способ решения проблемы.
Это настолько неэффективный и извилистый путь, что я бы сказал, что это неправильный ответ, даже если он несколько решает вопрос.
Этот ответ не имеет ничего общего с вопросом.
Зачем все усложнять?
testlist = [1,2,3,5,3,1,2,1,6]
for position, item in enumerate(testlist):
if item == 1:
print position
Попробуйте следующее:
testlist = [1,2,3,5,3,1,2,1,6]
position=0
for i in testlist:
if i == 1:
print(position)
position=position+1
Просто чтобы проиллюстрировать полный пример вместе с input_list, у которого есть searies1 (пример: input_list [0]), в котором вы хотите выполнить поиск series2 (пример: input_list [1]) и получить индексы series2, если он существует в series1.
Примечание: ваш 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]
заменить range () на xrange () - range () создает список, xrange () создает итератор. xrange () использует меньше памяти, а первоначальный вызов выполняется быстрее.