2008-12-13 6 views

ответ

222

Хммм. Здесь был ответ со списком, но он исчез.

Здесь:

[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] 

Update:

Итак, вы хотите выражение генератора, мы будем иметь выражение генератора. Вот список понимание снова в цикле:

>>> 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.

10
for i in xrange(len(testlist)): 
    if testlist[i] == 1: 
    print i 

xrange вместо диапазона в соответствии с просьбой (см комментарии).

+0

replace range() с помощью xrange() - range() создает список, xrange() создает итератор. xrange() использует waaaay меньше памяти, а внутренний вызов выполняется быстрее. – gnud 2008-12-13 01:39:38

+2

Я соглашаюсь на большие списки в программах python 2. Обратите внимание, что «диапазон» все равно будет работать в python 3 (и работает как xrange IIRC). «xrange» идет по пути динозавров. – jakber 2008-12-13 01:44:41

+0

Обновление: `xrange` отбрасывается в Python 3.x, так как новый` range` является старым `xrange` – 2017-03-13 12:51:07

39

Используйте перечисление:

testlist = [1,2,3,5,3,1,2,1,6] 
for position, item in enumerate(testlist): 
    if item == 1: 
     print 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 

Если вы ожидаете, чтобы найти значение много вы, вероятно, следует просто добавить «индекс» в список и распечатать список в конце, чтобы сэкономить время на итерацию.

+0

Я сделал некоторые тесты времени. Метод распознавания списка работает на 38% быстрее, чем этот код. (Я заменил ваш оператор печати вызовом outputlist.append) – Deestan 2008-12-13 16:31:43

+0

Я также провел несколько тестов с размером списка 100000 случайных значений от 1 до 100. Код, который я написал, был в некоторых случаях в два раза быстрее. Тестирование времени не сравнимо с приложением плаката (они должны обязательно убедиться, конечно, конечно). Прошу прощения, если мое мнение наносит ущерб этой должности. – 2008-12-13 17:05:57

-2
testlist = [1,2,3,5,3,1,2,1,6] 
for id, value in enumerate(testlist): 
    if id == 1: 
     print testlist[id] 

Я думаю, что это то, что вам нужно. ;-) «id» всегда будет индексом значений в списке.

3

Вот еще один способ сделать это:

try: 
    id = testlist.index('1') 
    print testlist[id] 
except: 
    print "Not Found" 
111

насчет следующего?

print testlist.index(element) 

Если вы не уверены, является ли элемент искать на самом деле в списке, вы можете добавить предварительную проверку, как

if element in testlist: 
    print testlist.index(element) 

или

print(testlist.index(element) if element in testlist else None) 

или " pythonic way ", что мне не очень нравится, потому что код менее ясен, но иногда эффективнее,

try: 
    print testlist.index(element) 
except ValueError: 
    pass 
0

Я думаю, что это может быть полезно использовать метод curselection() из thte библиотеки Tkinter:

from Tkinter import * 
listbox.curselection() 

Этот метод работает на ListBox виджеты Tkinter, так что вам нужно, чтобы построить одну из них вместо списка.

Это возвращает позицию так:

(«0»,) (хотя более поздние версии Tkinter может возвращать список Интс вместо)

, которая является для первой позиции а номер будет меняться в соответствии с положением позиции.

Для получения дополнительной информации см эту страницу: http://effbot.org/tkinterbook/listbox.htm

приветствий.

0

Зачем усложнять вещи?

testlist = [1,2,3,5,3,1,2,1,6] 
for position, item in enumerate(testlist): 
    if item == 1: 
     print position 
Смежные вопросы