2009-03-16 12 views
7

J'ai une liste d'entiers. Je veux savoir si le numéro 13 y figure et, si oui, où. Dois-je faire une recherche dans la liste deux fois, comme dans le code ci-dessous?Les listes Python ont-elles un équivalent de dict.get?

if 13 in intList: 
    i = intList.index(13) 

Dans le cas des dictionnaires, il y a une fonction get qui vérifiera l'adhésion et effectuer consultation avec la même recherche. Y a-t-il quelque chose de similaire pour les listes?

Répondre

12

Vous avez répondu vous-même avec la méthode index(). Cela lancera une exception si l'indice ne se trouve pas, si juste attraper que:

def getIndexOrMinusOne(a, x): 
    try: 
    return a.index(x) 
    except ValueError: 
    return -1 
+0

N'utilisez jamais une clause sauf vide. Vous devriez faire sauf IndexError. –

+0

qui ne fonctionnerait pas. [] .index() lance un ValueError – SingleNegationElimination

+0

Vous utilisez probablement des listes si vous avez besoin de faire les choses de cette façon; Cela ressemble à une odeur de code. –

7

Il semble que vous aurez juste à attraper l'exception ...

try: 
    i = intList.index(13) 
except ValueError: 
    i = some_default_value 
-1

Il suffit de mettre ce que vous entrer dans une fonction et l'utiliser :)

Vous pouvez utiliser le if i in list: return list.index(i) ou le try/except, selon vos préférences.

3

Non, il n'y a pas de correspondance directe pour ce que vous avez demandé. Il y avait a discussion a while back sur la liste de diffusion Python à ce sujet, et les gens ont conclu que c'était probablement une odeur de code si vous en aviez besoin. Envisagez d'utiliser un dict ou plutôt si vous souhaitez tester l'appartenance de cette manière.

+0

Je pense que vous n'avez pas lu attentivement la question. – vartec

+0

Ah, whoops; tu as raison. Fixé! –

+0

Cela ne fait que condenser la syntaxe de l'exemple de code original. Le problème de performance est non résolu. Python teste toujours si élément dans la liste d'abord, puis recherche l'index de l'élément dans la liste. –

2

Vous pouvez attraper l'exception ValueError, ou vous pouvez faire:

i = intList.index(13) if 13 in intList else -1 

(Python 2.5+)

BTW. Si vous allez effectuer un gros lot d'opérations similaires, vous pouvez envisager de construire une valeur de dictionnaire inverse -> index.

intList = [13,1,2,3,13,5,13] 
indexDict = defaultdict(list) 
for value, index in zip(intList, range(len(intList))): 
    indexDict[value].append(index) 

indexDict[13] 
[0, 4, 6] 
Questions connexes