Encuentra un elemento en una lista de tuplas

140

Tengo una lista 'a'

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

Necesito encontrar todas las tuplas para un número en particular. decir por 1 será

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

¿Cómo puedo hacer eso?

Bruce
fuente

Respuestas:

236

Si solo desea que el primer número coincida, puede hacerlo así:

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

Si solo está buscando tuplas con 1 en ellas:

[item for item in a if 1 in item]
Nadia Alramli
fuente
115

En realidad, hay una manera inteligente de hacer esto que es útil para cualquier lista de tuplas donde el tamaño de cada tupla es 2: puede convertir su lista en un solo diccionario.

Por ejemplo,

test = [("hi", 1), ("there", 2)]
test = dict(test)
print test["hi"] # prints 1
Steven Holtzen
fuente
11
¿Cómo aplicas esto al problema de Bruce?
HelloGoodbye
55
Buena respuesta (aunque posiblemente no para esta pregunta). Me funcionó bien para determinar si un valor estaba en una lista de tuplas de elección (por ejemplo, si "hola" en la prueba)
MagicLAMP
10
Realmente no responde la pregunta, como sugiere MagicLAMP. Específicamente, dict(X)convierte X en un diccionario donde la última tupla de cualquier primer elemento común es el valor que se utiliza. En el ejemplo del OP, esto devolvería (1,4) en oposición a ambos (1,2) y (1,4).
BBischof
23

Leer en la lista de comprensiones

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

Lea también las funciones del generador y la yielddeclaración.

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

result= list( filter_value( a, 1 ) )
S.Lott
fuente
1
if x == 1debería serif x == value
sambha
10
[tup for tup in a if tup[0] == 1]
Tendayi Mawushe
fuente
8
for item in a:
   if 1 in item:
       print item
ghostdog74
fuente
2
>>> [i for i in a if 1 in i]

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

suyash
fuente
1

La filterfunción también puede proporcionar una solución interesante:

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

que busca las tuplas en la lista para cualquier ocurrencia de 1. Si la búsqueda se limita al primer elemento, la solución se puede modificar en:

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

Usando la función de filtro:

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

O takewhile(además de esto, se muestra un ejemplo de más valores):

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

si no está ordenado, 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)]
>>> 
U10-Adelante
fuente
0

si desea buscar en la tupla cualquier número que esté presente en la tupla, puede 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)

También puede usar if i==j[0] or i==j[index]si desea buscar un número en un índice particular

sunil nagori
fuente