3 votes

Existe-t-il une valeur "Don't Care" pour les listes en Python ?

Y a-t-il un moyen d'utiliser count() où vous recherchez une valeur spécifique dans la liste imbriquée et ne vous souciez pas du reste ?

lst = [[1,6],[1,4],[3,4],[1,2]]
X = 1
lst.count([X, _ ])

Cela renverrait un compte de 3 car il y a trois listes imbriquées qui ont une valeur de 1 dans le premier indice.

Y a-t-il un moyen de le faire ?

4voto

Jonathan R Points 1426

Vous pouvez faire len(filter(lambda x: x[0] == 1, lst))

Mais attention, si votre liste contient un élément qui n'est pas une liste (ou une liste vide), une exception sera levée ! Ce problème pourrait être résolu en ajoutant deux conditions supplémentaires

len(filter(lambda x: type(x) == list and len(x) > 0 and x[0] == 1, lst))

3voto

Prune Points 4656

Regardez la longueur d'une liste filtrée :

my_list = [[1,6][1,4][3,4][1,2]]
X = 1
len([q for q in my_list if q[0] == X])

Ou, si vous préférez utiliser count puis faites une liste des articles que vous faire se soucier :

[q[0] for q in my_list].count(X)

2voto

timgeb Points 5966

Le comptage de la fréquence d'apparition d'une valeur en première position nécessite un passage complet sur la liste, donc si vous prévoyez d'utiliser la fonction potentielle countfunction(inputlist, target) plus d'une fois sur la même liste, il est plus efficace de construire un dictionnaire contenant tous les comptes (ce qui nécessite également une seule passe) que vous pouvez ensuite interroger avec O(1).

>>> from collections import Counter
>>> from operator import itemgetter
>>> 
>>> lst = [[1,6],[1,4],[3,4],[1,2]]
>>> c = Counter(map(itemgetter(0), lst))
>>> c[1]
3
>>> c[3]
1
>>> c[512]
0

0voto

pault Points 12252

D'autres ont montré de bonnes façons d'aborder ce problème en utilisant les modules intégrés de python, mais vous pouvez utiliser numpy si ce que tu cherches vraiment est une indexation fantaisiste.

Par exemple :

import numpy as np
lst = np.array([[1,6],[1,4],[3,4],[1,2]])
print(lst)
#array([[1, 6],
#       [1, 4],
#       [3, 4],
#       [1, 2]])

Dans ce cas lst est un numpy.ndarray avec forme (4,2) (4 lignes et 2 colonnes). Si vous voulez compter le nombre de lignes dont la première colonne (index 0) est égale à X vous pouvez écrire :

X = 1
print((lst[:,0] == X).sum())
#3

La première partie lst[:,0] signifie saisir toutes les lignes et seulement le premier index.

print(lst[:,0])
#[1 1 3 1]

Ensuite, vous vérifiez laquelle de ces valeurs est égale à X :

print(lst[:,0]==X)
#[ True  True False  True]

Enfin, additionnez le tableau résultant pour obtenir le nombre. (Il y a une conversion implicite de bool a int pour la somme).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X