是否有更可读的方法来检查埋在dict中的密钥是否存在而不是单独检查每个级别?
假设我需要在埋藏的对象中获取此值(示例来自维基数据):
x = s['mainsnak']['datavalue']['value']['numeric-id']
Run Code Online (Sandbox Code Playgroud)
为了确保这不会以运行时错误结束,有必要检查每个级别,如下所示:
if 'mainsnak' in s and 'datavalue' in s['mainsnak'] and 'value' in s['mainsnak']['datavalue'] and 'nurmeric-id' in s['mainsnak']['datavalue']['value']:
x = s['mainsnak']['datavalue']['value']['numeric-id']
Run Code Online (Sandbox Code Playgroud)
我能想到解决这个问题的另一种方法是将它包装成一个try catch
构造,我觉得这个简单的任务也很尴尬.
我正在寻找类似的东西:
x = exists(s['mainsnak']['datavalue']['value']['numeric-id'])
Run Code Online (Sandbox Code Playgroud)
True
如果所有级别都存在则返回
我想知道为什么try-except比下面的程序中的if慢.
def tryway():
try:
while True:
alist.pop()
except IndexError:
pass
def ifway():
while True:
if alist == []:
break
else:
alist.pop()
if __name__=='__main__':
from timeit import Timer
alist = range(1000)
print "Testing Try"
tr = Timer("tryway()","from __main__ import tryway")
print tr.timeit()
print "Testing If"
ir = Timer("ifway()","from __main__ import ifway")
print ir.timeit()
Run Code Online (Sandbox Code Playgroud)
我得到的结果很有趣.
Testing Try
2.91111302376
Testing If
0.30621099472
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么尝试这么慢?
在下面的代码中,什么更有效/更'Pythonic'?使用try-catch子句或if-else子句?
fname = 'AdobeARM.log'
letters = {}
with open(fname,'r') as f:
for line in f:
for c in line:
try:
letters[c] += 1
except KeyError:
letters[c] = 1
print letters
Run Code Online (Sandbox Code Playgroud)
VS.
fname = 'AdobeARM.log'
letters = {}
with open(fname,'r') as f:
for line in f:
for c in line:
if letters.has_key(c):
letters[c] += 1
else:
letters[c] = 1
print letters
Run Code Online (Sandbox Code Playgroud)
我倾向于使用try catch选项,但我不确定为什么.
编辑2:有人建议这是一个类似问题的副本.我不同意,因为我的问题集中在速度,而另一个问题是什么更"可读"或"更好"(没有更好地定义).虽然问题相似,但所给出的讨论/答案存在很大差异.
编辑:我从问题中意识到我可以更清楚.对不起代码拼写错误,是的,它应该使用适当的python运算符进行添加.
关于输入数据,我只选择了一个随机数列表,因为这是一个常见的样本.在我的情况下,我正在使用一个dict,我期望很多keyerrors,可能95%的密钥将不存在,并且存在的少数将包含数据集群.
无论输入数据集如何,我都对一般性讨论感兴趣,但当然有运行时间的样本很有趣.
我的标准方法就像许多其他帖子一样
list = (100 random numbers)
d = {}
for x in list:
if x in d:
d[x]+=1
else:
d[x]=1
Run Code Online (Sandbox Code Playgroud)
但我只是想到这个更快,因为我们不必检查字典是否包含密钥.我们只是假设它确实如此,如果没有,我们会处理它.有什么区别或者Python比我聪明吗?
list = (100 random numbers)
d = {}
for x in list:
try:
d[x]+=1
except KeyError:
d[x] = 1
Run Code Online (Sandbox Code Playgroud)
与数组中的索引,越界,负索引等相同的方法.
在Python 3中,我有一个编程如下的程序.它基本上接受来自用户的输入并根据字典(EXCHANGE_DATA)进行检查并输出信息列表.
from shares import EXCHANGE_DATA
portfolio_str=input("Please list portfolio: ")
portfolio_str= portfolio_str.replace(' ','')
portfolio_str= portfolio_str.upper()
portfolio_list= portfolio_str.split(',')
print()
print('{:<6} {:<20} {:>8}'.format('Code', 'Name', 'Price'))
EXCHANGE_DATA = {code:(share_name,share_value) for code, share_name, share_value in EXCHANGE_DATA}
try:
for code in portfolio_list:
share_name, share_value = EXCHANGE_DATA[code]
print('{:<6} {:<20} {:>8.2f}'.format(code, share_name, share_value))
except KeyError:
pass
Run Code Online (Sandbox Code Playgroud)
输入示例:
GPG,HNZ,DIL,FRE
输出如下:
Please list portfolio: GPG,HNZ,DIL,FRE
Code Name Price
GPG Guinnesspeat 2.32
HNZ Heartland Nz 3.85
DIL Diligent 5.30
FRE Freightway 6.71
Run Code Online (Sandbox Code Playgroud)
但如果我有一个输入,如:
AIR,HNZ,AAX,DIL,AZX
其中术语AAX,AZX
不存在于字典(EXCHANGE_DATA)
,但条款AIR,HNZ,DIL …
我有一些包含相似数据的字典。
大多数查询将通过一次搜索一个词典来解决。
那么,在性能上明智的做法是,不对dict中是否存在键进行初步检查,而尝试在except子句中捕获键错误的下一个dict上尝试呢?
或者像
# d1, d2, d3 = bunch of dictionaries
value = d1.get(key, d2.get(key, d3.get(key, 0)))
Run Code Online (Sandbox Code Playgroud)
?
目前,我正在尝试用Python填充字典,但我认为我所做的有点多余.是否有更多pythonic方式来执行以下操作:
if not pattern_file_map.get(which_match):
pattern_file_map[which_match] = [line]
else:
pattern_file_map[which_match].append(line)
Run Code Online (Sandbox Code Playgroud)
哪里pattern_file_map
是字典.
我知道在检查字典中是否有密钥时会有一定的习惯用法,比如 这个问题,但是我只想用一个列表来填充这个字典.
python ×7
dictionary ×4
performance ×3
counter ×1
idioms ×1
keyerror ×1
object ×1
python-3.x ×1
variables ×1