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 Réponses :
Si vous n'avez vraiment qu'une liste des valeurs, le meilleur que vous puissiez faire est de quelque chose comme mais il serait probablement préférable de maintenir, disons, un Incidemment, l'utilisation de définir < / code> ou dict code> 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. P> Liste code> 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 code> code> intégrée (qui transforme les choses dans les listes) et se confondre car votre liste list code> n'est pas appelable. Ou, inversement, essayer d'utiliser votre variable code> code> quelque part où il se trouve être hors de portée et être confus, car vous ne pouvez pas vous indiquer dans la liste code> intégrée. P > p>
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
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 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 () code> hors de l'expression génératrice.
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
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):
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')
Notez que l'opérateur code> dans code> pour les listes est itérant toutes les valeurs interne de toute façon; Si vous voulez une efficacité, un
gelenset code> 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 code> 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 code> est toujours O (1) mémoire pour la recherche cependant