2017-09-14 2 views
0

Je me demande si c'est possible en python. J'accéder à une liste de cette façon:Python - variable comme index de la liste

print list[0]['name'] 

C'est très bien. Y a-t-il un moyen d'utiliser une variable? Je veux dire:

a="[0]['name']" 
print list[a] 

Merci pour vos suggestions.

Quelques détails:

J'ai une situation où j'ai quelque chose comme ceci:

a = [{"name":"someone", "age":23}] 
print a[0]['name'] 

Mais depuis que je dois passer "[0] [ 'name']" comme paramètre, je Je voudrais comprendre si c'est possible. Merci,

CIPS

+0

Vous devez expliquer pourquoi vous en avez besoin. Sinon, il ne peut être accompli avec 'eval' ou' exec' – JBernardo

+0

Voulez-vous utiliser cette chaîne particulière pour indexer votre liste, ou est-ce que la variable peut avoir une valeur différente? Par exemple 'a = [0, 'nom']'? –

+0

S'il vous plaît voir ma vérification ci-dessous. – Ajax1234

Répondre

-2

En général, il est dangerous to use eval, mais vous avez besoin essentiellement de convertir votre chaîne pour effectuer votre indexation.

Alors d'abord, vous pouvez obtenir votre liste comme str utilisant repr

>>> l = [{'name': 'bob'}] 
>>> repr(l) 
"[{'name': 'bob'}]" 

alors si vous concaténer que votre opération d'index

>>> a = "[0]['name']" 
>>> repr(l) + a 
"[{'name': 'bob'}][0]['name']" 

alors eval la chose, il devrait faire l'affaire

>>> eval(repr(l) + a) 
'bob' 
+1

S'il vous plaît, non. Éviter 'eval' est presque _trivial_ dans ce cas; vous pouvez facilement analyser la chaîne '" [0] ['name'] "' dans une liste comme '[0, 'name']', puis utiliser ces valeurs pour indexer 'a'. –

-1

En ce qui concerne votre édition la plus récente, vous ne pouvez pas passer une chaîne qui contient l'index et la clé. Cependant, vous pouvez utiliser eval pour convertir l'expression entière à Python valide:

a = [{"name":"someone", "age":23}] 
s = "[0]['name']" 
new_s = eval("a{}".format(s)) 
print new_s 

Sortie:

someone 
+1

@CoryKramer Clairement cela ne peut pas être atteint. – Antimony

+0

@CoryKramer L'OP propose une solution créative, mais finalement incompatible avec la syntaxe Python. Cette réponse pointe l'OP dans la bonne direction. – Ajax1234

+1

Veuillez ne pas préconiser l'utilisation de 'eval' ou' exec'. C'est presque trivial de résoudre le problème de l'OP _without_ 'eval'. 'eval' ouvre un énorme trou de sécurité dans votre code sans raison. –

-2

vous pouvez utiliser la foncti sur eval ('a [0] [nom]'), il évaluera la chaîne à l'intérieur comme un code python.

est la référence ici: https://docs.python.org/3/library/functions.html#eval

+0

Bienvenue dans StackOverflow. Veuillez lire [réponse] pour écrire de meilleures réponses à l'avenir. – Marco

+1

Veuillez ne pas recommander l'utilisation de 'eval' ou' exec'. C'est presque trivial de résoudre le problème de l'OP _without_ 'eval'. 'eval' ouvre un énorme trou de sécurité dans votre code sans raison. –

-3

Vous pouvez utiliser la commande exec

exec("print(list{})".format(a)) 

J'espère que cela fonctionne

+1

Veuillez ne pas recommander l'utilisation de 'eval' ou' exec'. C'est presque trivial de résoudre le problème de l'OP _without_ 'exec'. 'exec' ouvre un énorme trou de sécurité dans votre code sans raison. –

1

Ceci est une simple question d'extraire les indices/clés de la chaîne "[0]['name']" puis en utilisant ces touches pour indexer la structure liste/dict.

data = [{"name":"someone", "age":23}] 
keys = "[0]['name']" 

# split the string into a list of indices/keys 
keys = keys[1:-1].split('][') 
# keys = ['0', "'name'"] 

# the keys are all strings, so we have to convert 
# each individual key to the correct type 
import ast 
keys = [ast.literal_eval(key) for key in keys] 
# keys = [0, 'name'] 

# now use the list of indices/keys we generated to get the value 
value = data 
for key in keys: 
    value = value[key] 

print(value) # output: someone