Respostas:
Hummm. Houve uma resposta com uma compreensão da lista aqui, mas ela desapareceu.
Aqui:
[i for i,x in enumerate(testlist) if x == 1]
Exemplo:
>>> testlist
[1, 2, 3, 5, 3, 1, 2, 1, 6]
>>> [i for i,x in enumerate(testlist) if x == 1]
[0, 5, 7]
Atualizar:
Ok, você quer uma expressão geradora, teremos uma expressão geradora. Aqui está a compreensão da lista novamente, em um loop for:
>>> for i in [i for i,x in enumerate(testlist) if x == 1]:
... print i
...
0
5
7
Agora vamos construir um gerador ...
>>> (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
e de maneira bastante inteligente, podemos atribuir isso a uma variável e usá-la a partir daí ...
>>> gen = (i for i,x in enumerate(testlist) if x == 1)
>>> for i in gen: print i
...
0
5
7
E pensar que eu costumava escrever FORTRAN.
args = ['x', '-p1', 'v1', '-p2', 'v2']
. Em seguida, o comando args[[i for i, x in enumerate(args) if x == '-p1'][0] + 1]
retorna'v1'
E o que se segue?
print testlist.index(element)
Se você não tiver certeza se o elemento a procurar está realmente na lista, adicione uma verificação preliminar, como
if element in testlist:
print testlist.index(element)
ou
print(testlist.index(element) if element in testlist else None)
ou a "maneira pitônica", da qual não gosto muito porque o código é menos claro, mas às vezes é mais eficiente,
try:
print testlist.index(element)
except ValueError:
pass
ValueError
for i in xrange(len(testlist)):
if testlist[i] == 1:
print i
xrange em vez do intervalo, conforme solicitado (ver comentários).
xrange
é preterido no Python 3.x, pois o novo range
é o antigoxrange
Aqui está outra maneira de fazer isso:
try:
id = testlist.index('1')
print testlist[id]
except ValueError:
print "Not Found"
[x for x in range(len(testlist)) if testlist[x]==1]
Experimente o abaixo:
testlist = [1,2,3,5,3,1,2,1,6]
position=0
for i in testlist:
if i == 1:
print(position)
position=position+1
Se sua lista ficou grande o suficiente e você esperava encontrar apenas o valor em um número escasso de índices, considere que esse código poderia ser executado muito mais rapidamente, porque você não precisa iterar todos os valores da lista.
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
Se você espera encontrar muito o valor, provavelmente deve anexar "index" a uma lista e imprimi-la no final para economizar tempo por iteração.
Eu acho que pode ser útil usar o método curselection () da biblioteca Tkinter:
from Tkinter import *
listbox.curselection()
Esse método funciona nos widgets da caixa de listagem do Tkinter, portanto, você precisará construir um deles em vez de uma lista.
Isso retornará uma posição como esta:
('0',) (embora versões posteriores do Tkinter possam retornar uma lista de entradas)
Qual é a primeira posição e o número será alterado de acordo com a posição do item.
Para mais informações, consulte esta página: http://effbot.org/tkinterbook/listbox.htm
Saudações.
Apenas para ilustrar um exemplo completo, juntamente com o input_list
que possui searies1
(exemplo: input_list [0]) no qual você deseja fazer uma pesquisa series2
(exemplo: input_list [1]) e obter índices da série2, se existir na série1.
Nota: Você certain condition
irá na expressão lambda se as condições forem simples
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)
resultado:
[0, 2, 6]