11
votes

Python: Vérifiez si la valeur est dans une liste, quel que soit le cas.

Je veux vérifier si une valeur est dans une liste, quelle que soit le cas des lettres, et je dois le faire efficacement.

C'est ce que j'ai: P>

if val in list:


5 commentaires

Notez que l'opérateur dans pour les listes est itérant toutes les valeurs interne de toute façon; Si vous voulez une efficacité, un gelenset est beaucoup mieux


@Cameron: Dépend si vous voulez que vous souhaitiez O (1) espace et O (n) heure ou inversement.


@delnan: Comment pouvez-vous obtenir O (1) espace?


@Cameron: seulement val et l'élément à comparer dans la mémoire à chaque heure donnée. Accordé, peut être irréalisable.


@delnan: Oh, je vois, je pensais que vous vouliez dire pour toute la structure de données ;-) a gelenget est toujours O (1) mémoire pour la recherche cependant


5 Réponses :


2
votes

Si vous n'avez vraiment qu'une liste des valeurs, le meilleur que vous puissiez faire est de quelque chose comme xxx

mais il serait probablement préférable de maintenir, disons, un définir < / code> ou dict dont les touches sont des versions minuscules des valeurs de la liste; De cette façon, vous n'aurez pas besoin de rester itération de (potentiellement) toute la liste.

Incidemment, l'utilisation de Liste comme nom de variable est un style médiocre, car list < / Code> est également le nom de l'un des types intégrés de Python. Vous risquez de vous retrouver essayer d'appeler la fonction intégrée (qui transforme les choses dans les listes) et se confondre car votre liste list n'est pas appelable. Ou, inversement, essayer d'utiliser votre variable quelque part où il se trouve être hors de portée et être confus, car vous ne pouvez pas vous indiquer dans la liste intégrée.


1 commentaires

Merci pour la réponse et les informations sur la liste. Bien que j'utilise juste la liste pour souligner l'exemple, il est toujours bon de savoir



16
votes
check = "asdf"
checkLower = check.lower()

print any(checkLower == val.lower() for val in ["qwert", "AsDf"])

# prints true
Using the any() function. This method is nice because you aren't recreating the list to have lowercase, it is iterating over the list, so once it finds a true value, it stops iterating and returns.Demo : http://codepad.org/dH5DSGLP

1 commentaires

+1 Pour être le seul étant paresseux (cela ne semble pas comme un compliment écrit ... Eh bien, vous savez ce que je veux dire). Il peut également être une bonne idée de déplacer le check.lower () hors de l'expression génératrice.



0
votes

Vous pouvez réduire les valeurs et les vérifier:

>>> val
'CaSe'
>>> l
['caSe', 'bar']
>>> val in l
False
>>> val.lower() in (i.lower() for i in l)
True


0 commentaires

4
votes

Si vous savez que vos valeurs sont toutes de type str code> ou unicode code>, vous pouvez essayer ceci:

if val in map(str.lower, list):
...Or:
if val in map(unicode.lower, list):


0 commentaires

0
votes
items = ['asdf', 'Asdf', 'asdF', 'asjdflk', 'asjdklflf']
itemset = set(i.lower() for i in items)

val = 'ASDF'
if val.lower() in itemset:  # O(1)
    print('wherever you go, there you are')

0 commentaires