Python - 变量作为列表索引

时间:2017-09-14 20:52:42

标签: python list indexing

我想知道在python中这是否可行。 我正以这种方式访问​​列表:

print list[0]['name']

这很好。有没有办法使用变量? 我的意思是:

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

感谢您的建议。

一些细节:

我遇到过这样的情况:

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

但是因为我需要传递“[0] ['name']”作为参数,我想知道这是否可行。 谢谢,

CIPS

6 个答案:

答案 0 :(得分:1)

这是从字符串"[0]['name']"中提取索引/键然后使用这些键来索引列表/字典结构的简单问题。

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

答案 1 :(得分:0)

我希望不要脱离上下文,但是如果可以的话,也许可以使用这样的函数 将s = "[0]['name']"转换为s = (0, 'name')

def search_index(obj, itero):
    try:
        return search_index(obj[next(itero)], itero)
    except StopIteration:
        return obj

a = [{"name":"someone", "age":23}]
s = (0, 'name')

result = search_index(a, iter(s))
# >>> result = 'someone'

如果要将"[0]['name']"转换为(0, 'name'),可以尝试以下操作:

import re
reg = re.findall(r'\[(\d*?)\]|\[\'(\w*?)\'\]', "[0]['name']")
s = [int(index[0]) if not index[1] else index[1] for index in reg]
# [0, 'name']

它将索引转换为正确的类型,以使用列表或字典。

答案 2 :(得分:-1)

关于最近的编辑,您无法传递包含索引和键的字符串。但是,您可以使用eval将整个表达式转换为有效的Python:

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

输出:

someone

答案 3 :(得分:-2)

一般情况下它是dangerous to use eval,但您基本上需要转换字符串才能执行索引。

首先,您可以使用str

将列表作为repr
>>> l = [{'name': 'bob'}]
>>> repr(l)
"[{'name': 'bob'}]"

然后如果你用索引操作连接它

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

然后eval整个事情,它应该做的伎俩

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

答案 4 :(得分:-2)

你可以使用函数eval('a [0] [name]'),它会将里面的字符串作为python代码进行评估。

这里是参考: https://docs.python.org/3/library/functions.html#eval

答案 5 :(得分:-3)

您可以使用exec命令

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

我希望它有效