相关疑难解决方法(0)

检查python dict中是否存在嵌套键的优雅方法

是否有更可读的方法来检查埋在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如果所有级别都存在则返回

python variables object

53
推荐指数
6
解决办法
4万
查看次数

Python如果vs try-except

我想知道为什么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)

任何人都可以解释为什么尝试这么慢?

python performance

25
推荐指数
1
解决办法
1万
查看次数

Python:尝试除了KeyError vs if has_key()

在下面的代码中,什么更有效/更'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选项,但我不确定为什么.

python performance

18
推荐指数
3
解决办法
4万
查看次数

Python:"除了KeyError"比"如果键入dict"更快?

编辑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 performance counter dictionary keyerror

11
推荐指数
1
解决办法
2万
查看次数

忽略KeyError并继续编程

在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 …

python dictionary python-3.x

9
推荐指数
2
解决办法
3万
查看次数

检查是否在dict或try / except中在python中具有更好的性能?

我有一些包含相似数据的字典。

大多数查询将通过一次搜索一个词典来解决。

那么,在性能上明智的做法是,不对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 dictionary

5
推荐指数
2
解决办法
2697
查看次数

用Python填充字典的更惯用的方法

目前,我正在尝试用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 dictionary idioms

1
推荐指数
1
解决办法
466
查看次数