如果python中存在key,则填充或附加dict值

时间:2017-04-13 08:13:03

标签: python dictionary

我想知道如果密钥存在,是否有更有效的方法来附加dict值,或者如果没有则创建一个。目前,我使用“org.springframework.boot.autoconfigure.EnableAutoConfiguration=my package.tracking.TrackerConfig

我阅读了许多谈论if key in set(dict.keys())的主题,但它是否有效?我的意思是,当你使用collections.defaultdict时,python是否会生成“if key in ...”或者它的工作方式是否有所不同?

我的问题是我的字数越来越大,所以我的collections.defaultdict每次执行的时间越来越长

以下是我所谈论的一个例子:

if key in set(dict.keys())

更准确地说,这个脚本用于处理Google AnalyticsAPI,以避免采样(因此我会对一个月中的每一天发出请求,因此我的网址(mydict键)很可能是相同的我要求的每一天。

2 个答案:

答案 0 :(得分:1)

如果你不想知道词典中是否存在键,你可以使用列表或任何其他数据类型来使用python词典。

In [26]: for i in a_list:
...:     my_dict.setdefault(i[0], {'session':0, 'transaction':0})
...:     my_dict[i[0]]['session'] += i[1]
...:     my_dict[i[0]]['transaction'] += i[2]
...:     
如果在dict中找不到key,

setdefault方法将只设置默认值。否则就不会设置它。

另一种方法

In [44]: for i in a_list:
    ...:     my_dict[i[0]] = dict()
    ...:     my_dict[i[0]]['session'] = my_dict[i[0]].setdefault('session', 0) + i[1]
    ...:     my_dict[i[0]]['transaction'] = my_dict[i[0]].setdefault('transaction', 0) + i[2]
    ...:  

您无需在此处检查dict中是否存在密钥。

答案 1 :(得分:0)

这种方法在速度方面胜过.setdefault() - 方法。

mydict = {}
for i in a_list:
    if i[0] not in mydict:
        mydict[i[0]] = {'session': 0, 'transactions': 0}
    mydict[i[0]]['session'] += i[1]
    mydict[i[0]]['transactions'] += i[2]

在iPython(Python2.7.13以及Python3.6.0)中使用我的MacBookAir进行基准测试,其中包含1000000个项目的样本列表