【问题标题】:Faster method to conditionally search nested dictionary Python有条件地搜索嵌套字典 Python 的更快方法
【发布时间】:2020-05-15 23:09:08
【问题描述】:

我有一个嵌套字典,我试图有条件地搜索它以获取一些值。我正在遍历另一个文件并获取 val1、val2 和 val3。从那里我搜索字典以根据某些条件查找 ID。

但是,对于 5500 万行数据,这是非常昂贵的。我找不到任何更快的方法来做到这一点,我正在把它放在火花工作上。我试着让它,如果找到一个 ID,我们会停止搜索字典,但我不确定我是否正确地这样做。

看来我遍历字典中的每个键来查找值,不知道如何优化它。任何帮助表示赞赏。代码如下:

for key, val in dict[val1].items():
    if key[0]==val2 or key[1] == val2:
        if len(val3)==1:
            if val3[0]%2==0:
                for key2, val2 in val.items():
                    if key2[2]<=val3[0] and key2[3]>=val3[0]:
                        ID = val2[0]
            if val3[0]%2!=0:
                for key2, val2 in val.items():
                    if key2[0]<=val3[0] and key2[1]>=val3[0]:
                        ID = val2[0]
      if ID!=None:
          break

编辑: 输入值是这样的

val1 = zone#
val2 = 'name'
val3 = score in tuple form like (2,)

嵌套字典看起来像这样:

{3: defaultdict(<function __main__.<lambda>.<locals>.<lambda>()>,
                         {('jeff', 'jeff A'): defaultdict(list,
                                      {(23,
                                        41,
                                        28,
                                        40,): [61814],

【问题讨论】:

  • 倒带一点。这种结构是如何存在的?有什么可以改变的吗?
  • if val3[0]%2==0: 取模来查找密钥表明出了点问题,至少对我而言
  • 至少,如果val3[0]%2 == 0 是假的,你知道 val3[0]%2 != 0 是真的;您不必重新计算该值。
  • 要优化您的搜索,您可以检查if value in dictionary.items(),而不是在for 循环中遍历字典中的所有值。这将节省您的时间
  • 所以,在创建所有这些字典之前。我们也许可以将它推入 pandas/numpy,但我 95% 确定你在这里设置的任何结构都会阻碍你/我们。我们只是看不到输入或输出

标签: python dictionary optimization nested conditional-statements


【解决方案1】:

@Gal 发布了答案,但现在的设置如下所示。运行速度比 for 循环迭代快 10 倍以上。

if val2 in dict[val1]:
            if len(val3)==1:
                if val3[0]%2==0:
                    for key2, val5 in dict[val1][val2].items():
                        if key2[2]<=val3[0] and key2[3]>=val3[0]:
                            ID = val5[0]

为了满足 val2 有两种可能结果的条件,我们创建了两个 dict 并运行此检查两次,现在速度快了很多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 2015-07-13
    • 2016-08-16
    • 2019-06-18
    • 1970-01-01
    相关资源
    最近更新 更多