web-dev-qa-db-fra.com

Sélectionnez la valeur dans la liste des tuples où la condition

J'ai une liste de tuples. Chaque Tuple a 5 éléments (correspondant à 5 colonnes de base de données) et je voudrais faire une requête

select attribute1 from mylist where attribute2 = something

par exemple.

personAge = select age from mylist where person_id = 10

Est-il possible d'interroger la liste des tuples d'une manière ou d'une autre?

je vous remercie

33
xralf

Si vous avez tuples nommés vous pouvez le faire:

results = [t.age for t in mylist if t.person_id == 10]

Sinon, utilisez des index:

results = [t[1] for t in mylist if t[0] == 10]

Ou utilisez le déballage du tuple selon la réponse de Nate. Notez que vous n'avez pas besoin de donner un nom significatif à chaque élément que vous déballez. Tu peux faire (person_id, age, _, _, _, _) pour déballer un tuple de six objets.

61
Steven Rumbalski

Une solution à cela serait une compréhension de la liste, avec une correspondance de modèle à l'intérieur de votre tuple:

>>> mylist = [(25,7),(26,9),(55,10)]
>>> [age for (age,person_id) in mylist if person_id == 10]
[55]

Une autre façon serait d'utiliser map et filter:

>>> map( lambda (age,_): age, filter( lambda (_,person_id): person_id == 10, mylist) )
[55]
14
Nate

Oui, vous pouvez utiliser le filtre si vous savez à quelle position du tuple se trouve la colonne souhaitée. Si le cas est que l'id est le premier élément du Tuple, vous pouvez filtrer la liste comme suit:

filter(lambda t: t[0]==10, mylist)

Cela renverra la liste des tuples correspondants. Si vous voulez l'âge, choisissez simplement l'élément que vous voulez. Au lieu de filtrer, vous pouvez également utiliser la compréhension de liste et choisir l'élément au premier coup. Vous pouvez même le déballer tout de suite (s'il n'y a qu'un seul résultat):

[age] = [t[1] for t in mylist if t[0]==10]

Mais je recommanderais fortement d'utiliser dictionnaires ou tuples nommés à cet effet.

8
rplnt