如果它的键存在,我需要一种获取字典值的方法,或者None如果不存在则需要返回.
但是,KeyError如果搜索不存在的密钥,Python会引发异常.我知道我可以检查密钥,但我正在寻找更明确的东西.None如果密钥不存在,有没有办法返回?
加入collections.defaultdict在Python 2.5大大降低用于需要dict的setdefault方法.这个问题适合我们的集体教育:
setdefault今天在Python 2.6/2.7中还有什么用处?setdefault被取代了collections.defaultdict?以下两个表达式似乎与我相同.哪个更好?
data = [('a', 1), ('b', 1), ('b', 2)]
d1 = {}
d2 = {}
for key, val in data:
# variant 1)
d1[key] = d1.get(key, []) + [val]
# variant 2)
d2.setdefault(key, []).append(val)
Run Code Online (Sandbox Code Playgroud)
结果是一样的,但哪个版本更好或更富有pythonic?
就个人而言,我觉得版本2难以理解,因为对我而言,setdefault非常难以掌握.如果我理解正确,它会在字典中查找"key"的值,如果不可用,则在"dict"中输入"[]",返回对值或"[]"的引用,并在其中附加"val"参考.虽然顺利但它至少不是直观的(至少对我而言).
在我看来,版本1更容易理解(如果可用,获取"key"的值,如果没有,获取"[]",然后加入由[val]组成的列表并将结果放在"key"中).但是,虽然更直观地理解,但我担心这个版本的性能会降低,所有这些列表都会创建.另一个缺点是"d1"在表达式中出现两次,这是相当容易出错的.可能有一个更好的实现使用get,但目前它没有我.
我的猜测是版本2虽然对于没有经验的人来说更难掌握,但速度更快,因此更可取.意见?
码:
for i in range(1000):
print(i) if i%10==0 else pass
Run Code Online (Sandbox Code Playgroud)
错误:
File "<ipython-input-117-6f18883a9539>", line 2
print(i) if i%10==0 else pass
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
为什么不"通过"在这里工作?