我想知道在python中这是否可行。 我正以这种方式访问列表:
print list[0]['name']
这很好。有没有办法使用变量? 我的意思是:
a="[0]['name']"
print list[a]
感谢您的建议。
一些细节:
我遇到过这样的情况:
a = [{"name":"someone", "age":23}]
print a[0]['name']
但是因为我需要传递“[0] ['name']”作为参数,我想知道这是否可行。 谢谢,
CIPS
答案 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))
我希望它有效