Encontre um elemento em uma lista de tuplas


139

Eu tenho uma lista 'a'

a= [(1,2),(1,4),(3,5),(5,7)]

Preciso encontrar todas as tuplas para um número específico. diga por 1 será

result = [(1,2),(1,4)]

Como faço isso?

Respostas:


236

Se você quer apenas o primeiro número correspondente, pode fazê-lo assim:

[item for item in a if item[0] == 1]

Se você está apenas procurando tuplas com 1 nelas:

[item for item in a if 1 in item]

115

Na verdade, existe uma maneira inteligente de fazer isso que é útil para qualquer lista de tuplas em que o tamanho de cada tupla é 2: você pode converter sua lista em um único dicionário.

Por exemplo,

test = [("hi", 1), ("there", 2)]
test = dict(test)
print test["hi"] # prints 1

11
Como você aplica isso ao problema de Bruce?
HelloGoodbye

5
Boa resposta (embora possivelmente não seja para esta pergunta). Funcionou bem para mim para determinar se um valor estava em uma lista de tuplas escolha (por exemplo, se "oi" em teste)
MagicLAMP

10
Realmente não responde à pergunta, como sugere o MagicLAMP. Especificamente, dict(X)converte X em um dicionário em que a última tupla de qualquer primeiro elemento comum é o valor usado. No exemplo do PO, isso retornaria (1,4) em oposição a ambos (1,2) e (1,4).
BBischof

23

Leia sobre Compreensões da lista

[ (x,y) for x, y in a if x  == 1 ]

Leia também as funções do gerador e a yielddeclaração.

def filter_value( someList, value ):
    for x, y in someList:
        if x == value :
            yield x,y

result= list( filter_value( a, 1 ) )

1
if x == 1deve serif x == value
sambha



1

Usando a função de filtro:

>>> def get_values ​​(iterables, key_to_find):
lista de retorno (filtro (lambda x: key_to_find em x, iterables)) >>> a = [(1,2), (1,4), (3,5), (5,7)] >>> get_values ​​(a, 1) >>> [(1, 2), (1, 4)]

1
>>> [i for i in a if 1 in i]

[(1, 2), (1, 4)]


1

Ou takewhile(além disso, exemplo de mais valores é mostrado):

>>> a= [(1,2),(1,4),(3,5),(5,7),(0,2)]
>>> import itertools
>>> list(itertools.takewhile(lambda x: x[0]==1,a))
[(1, 2), (1, 4)]
>>> 

se não classificado, como:

>>> a= [(1,2),(3,5),(1,4),(5,7)]
>>> import itertools
>>> list(itertools.takewhile(lambda x: x[0]==1,sorted(a,key=lambda x: x[0]==1)))
[(1, 2), (1, 4)]
>>> 

0

A filterfunção também pode fornecer uma solução interessante:

result = list(filter(lambda x: x.count(1) > 0, a))

que procura nas tuplas da lista qualquer ocorrência de 1. Se a pesquisa estiver limitada ao primeiro elemento, a solução poderá ser modificada em:

result = list(filter(lambda x: x[0] == 1, a))

0

Se você deseja pesquisar na tupla por qualquer número presente na tupla, pode usar

a= [(1,2),(1,4),(3,5),(5,7)]
i=1
result=[]
for j in a:
    if i in j:
        result.append(j)

print(result)

Você também pode usar if i==j[0] or i==j[index]se quiser pesquisar um número em um índice específico

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.