在Python中是否有与Clojure的get-in函数等效的东西?它以某种数据结构在给定的路径上获取数据。
在Clojure中,其用法类似于:
(def employee
{:name "John"
:details {:email "info@domain.com"
:phone "555-144-300"}})
(get-in employee [:details :email]) ; => "info@domain.com"
如果转换为Python语法,则将使用以下方式:
dictionary = {'a': {'b': 10}}
get_in(dictionary, ['a', 'b']) # => 10
此函数用于访问嵌套数据结构中的任意数据点,这些路径在编译时是未知的,它们是动态的。 clojuredocs上有get-in
的更多用法示例。
答案 0 :(得分:2)
不,但是您可以制作一个
def get_in(d, keys):
if not keys:
return d
return get_in(d[keys[0]], keys[1:])
答案 1 :(得分:1)
您可以写:
dictionary.get('details', {}).get('email')
这将安全地获取您所需的值或None
,而不会引发异常-就像Clojure的get-in
一样。
如果您需要专用功能,可以编写:
def get_in(d, keys):
if not keys:
return d
elif len(keys) == 1:
return d.get(keys[0])
else:
return get_in(d.get(keys[0], {}), keys[1:])
答案 2 :(得分:0)
一个简单的for循环应该可以解决您的问题-
x = {'a':{'b':{'c': 1}}}
def get_element(elements, dictionary):
for i in elements:
try:
dictionary = dictionary[i]
except KeyError:
return False
return dictionary
print(get_element(['a', 'b', 'c'], x))
# 1
print(get_element(['a', 'z', 'c'], x))
# False