Rechercher un élément dans une liste de tuples

140

J'ai une liste 'a'

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

J'ai besoin de trouver tous les tuples pour un nombre particulier. dis pour 1 ce sera

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

Comment je fais ça?

Bruce
la source

Réponses:

236

Si vous voulez juste que le premier numéro corresponde, vous pouvez le faire comme ceci:

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

Si vous recherchez simplement des tuples contenant 1:

[item for item in a if 1 in item]
Nadia Alramli
la source
115

Il existe en fait une manière intelligente de faire cela qui est utile pour toute liste de tuples où la taille de chaque tuple est 2: vous pouvez convertir votre liste en un seul dictionnaire.

Par exemple,

test = [("hi", 1), ("there", 2)]
test = dict(test)
print test["hi"] # prints 1
Steven Holtzen
la source
11
Comment appliquez-vous cela au problème de Bruce?
HelloGoodbye
5
Bonne réponse (mais peut-être pas pour cette question). Cela a bien fonctionné pour moi de déterminer si une valeur était dans une liste de tuples de choix (par exemple, si "salut" dans le test)
MagicLAMP
10
Cela ne répond pas vraiment à la question, comme le suggère MagicLAMP. Plus précisément, dict(X)convertit X en un dictionnaire où le dernier tuple de tout premier élément commun est la valeur utilisée. Dans l'exemple de l'OP, cela renverrait (1,4) par opposition aux deux (1,2) et (1,4).
BBischof
23

En savoir plus sur les compréhensions de listes

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

Lisez également les fonctions du générateur et la yielddéclaration.

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

result= list( filter_value( a, 1 ) )
S.Lott
la source
1
if x == 1devrait êtreif x == value
sambha
10
[tup for tup in a if tup[0] == 1]
Tendayi Mawushe
la source
8
for item in a:
   if 1 in item:
       print item
ghostdog74
la source
2
>>> [i for i in a if 1 in i]

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

suyash
la source
1

La filterfonction peut également apporter une solution intéressante:

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

qui recherche les tuples dans la liste pour toute occurrence de 1. Si la recherche est limitée au premier élément, la solution peut être modifiée en:

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

Utilisation de la fonction de filtre:

>>> def get_values ​​(iterables, key_to_find):
liste de retour (filtre (lambda x: key_to_find in x, iterables)) >>> a = [(1,2), (1,4), (3,5), (5,7)] >>> get_values ​​(a, 1) >>> [(1, 2), (1, 4)]
pradam
la source
1

Ou takewhile, (en plus de cela, un exemple de plus de valeurs est affiché):

>>> 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 non trié, comme:

>>> 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-avant
la source
0

si vous souhaitez rechercher un tuple pour tout nombre présent dans le tuple, vous pouvez utiliser

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)

Vous pouvez également utiliser if i==j[0] or i==j[index]si vous souhaitez rechercher un numéro dans un index particulier

Sunil Nagori
la source