有没有一种聪明的方法可以用三行或四行编写以下代码?
a=l["artist"]
if a:
b=a["projects"]
if b:
c=b["project"]
if c:
print c
所以我想像伪代码那样:
a = l["artist"] if True:
答案 0 :(得分:8)
怎么样:
try:
print l["artist"]["projects"]["project"]
except KeyError:
pass
except TypeError:
pass # None["key"] raises TypeError.
此值为try
到print
,但如果引发KeyError
,则会运行except
块。 pass
意味着什么都不做。这是众所周知的和EAFP: E 更强 A sk F orgiveness比 P 错误。
答案 1 :(得分:5)
我不一定认为这样做会更好,但你可以做到:
try:
c = l["artist"]["projects"]["project"]
except (KeyError, TypeError) as e:
print e
pass
答案 2 :(得分:0)
p = l.get('artist') and l['artist'].get('projects') and l['artist']['projects'].get('project')
if p:
print p
您还可以为此目的制作更通用的功能:
def get_attr(lst, attr):
current = lst
for a in attr:
if current.get(a) is not None:
current = current.get(a)
else:
break
return current
>>> l = {'artist':{'projects':{'project':1625}}}
>>> get_attr(l,['artist','projects','project'])
1625
答案 3 :(得分:0)
单行(如标题中所示),无例外:
{{1}}
答案 4 :(得分:0)
由于您正在处理嵌套字典,因此您可能会发现这种通用的单行有用,因为它允许您通过传递更多keys
个参数来访问任何级别的值:
nested_dict_get = lambda item, *keys: reduce(lambda d, k: d.get(k), keys, item)
l = {'artist': {'projects': {'project': 'the_value'}}}
print( nested_dict_get(l, 'artist', 'projects', 'project') ) # -> the_value
注意:在Python 3中,您需要在顶部添加from functools import reduce
。