【问题标题】:Populate or append dict value if key exists in python如果 python 中存在键,则填充或附加 dict 值
【发布时间】:2017-04-13 18:28:56
【问题描述】:

我想知道是否有一种更有效的方法可以在键存在时附加 dict 值,或者如果不存在则创建一个。目前,我使用“if key in set(dict.keys())

我读了很多关于collections.defaultdict但它有效的话题吗?我的意思是,当您使用collections.defaultdict 时,python 是制作“if key in ...”还是工作方式不同?

我的问题是我的字典越来越大,所以我的if key in set(dict.keys()) 每次执行的时间都越来越长

这是我所说的一个例子:

# a_list is a result of a loop that can iterate more than 10, 100, 1000...times
a_list = [[url1, sessions, transactions], [url2, sessions, transactions]...]
mydict = {}
for i in a_list:
    # if my key doesn't exist
    if i[0] not in set(mydict.keys()):
        mydict[i[0]] = {}
        mydict[i[0]]['session'] = i[1]
        mydict[i[0]]['transactions'] = i[2]

    else:
    # if my key exists
        mydict[i0]['sessions'] += i[1]
        mydict[i0]['transactions'] += i[2]

更准确地说,这个脚本是用来处理 Google Analytics API 的,以避免采样(所以我每个月的每一天都发出请求,所以我的 url(mydict 键)很有可能是相同的我每天都要求。

【问题讨论】:

  • 如果您知道if key in set(dict.keys()) 并且您很有可能每个请求的密钥都相同,您可以尝试“缓存”您确定存在的密钥(仅缓存最后一个密钥或缓存最后几个键),如果缓存了键,则不要在大字典中检查它,如果 mydict 真的很大,它可能会稍微提高性能。
  • 是的,defaultdict 会快得多。此外,if i[0] not in set(mydict.keys()) 非常浪费。一个dict已经是一个hashmap,成员资格测试是一个常数时间的操作,检查一个key是否不存在应该由if i[0] not in mydict简单地完成。
  • “我使用“if key in set(dict.keys())” - 为什么?if key in dictO(1),如果你每次都建立一个集合那是O(n)
  • 您可以使用mydict.has_key 而不是在每次迭代时创建密钥集。
  • @thedude 更习惯使用 key in my_dictmy_dict.has_key 甚至在 Python 3 中都不再使用了,所以最好不要使用它。

标签: python dictionary


【解决方案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]
...:     

setdefault 方法只会在 dict 中找不到 key 时设置默认值。否则不会设置。

另一种方法

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]
    ...:  

您不必在此处检查字典中是否存在密钥。

【讨论】:

    【解决方案2】:

    这种方法在速度方面优于.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 个项目的示例列表

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 2011-01-16
      • 2023-03-16
      • 1970-01-01
      • 2021-10-22
      • 2019-11-07
      • 1970-01-01
      相关资源
      最近更新 更多