有没有一种快速的方法来更新嵌套字典中具有特定值的一组键?

kspr

我有一个帮助字典,其中的键是事件对和功能的嵌套元组,功能的数量可以在1-N之间。该值是所述事件对和功能的支持。

我有一个字典d,它是一个嵌套字典,其中将存储每个事件对的支持以及该功能的每个可能的部分重复。

这是在以下代码段中完成的

  help_d = {(('Event 1', 'Event 2'),('Feature A', 'Feature B',...,'Feature T', 'Feature H')) : 10,
            (('Event 1', 'Event 3'),('Feature C', 'Feature E',...,'Feature H', 'Feature G')) : 50,
            (('Event 1', 'Event 4'),('Feature F', 'Feature G',...,'Feature T', 'Feature X')) : 100,
             .....
            (('Event 10', 'Event 15'),('Feature D', 'Feature E',....,'Feature V', 'Feature B')) : 5}


 d = defaultdict(int,defaultdict())
 
 for key,value in help_d.items():
     event_a = key[0][0]
     event_b = key[0][1]
     feature_tuple = key[1]
     
     #Every possible partial duplicate of the features
     all_keys_to_update = list(itertools.product(*zip(feature_tuple, itertools.repeat(''))))

     #Nested for loop that takes around 3-4 secs per iteration
     for key_to_update in all_keys_to_update:
         d[(event_a,event_b)][key_to_update] += value

的大小help_dict约为12000个密钥。

列表的大小all_keys_to_update约为10000。

嵌套的for循环大约需要3-4秒,这意味着大约需要11个小时才能完成此特定代码段

我只有3个事件和2个功能的示例

help_d = {(('Event 1', 'Event 2'),('Feature A', 'Feature B')) : 10,
         (('Event 1', 'Event 2'),('Feature A', 'Feature C')) : 20,
         (('Event 1', 'Event 3'),('Feature D', 'Feature C')) : 50,
         (('Event 2', 'Event 3'),('Feature D', 'Feature B')) : 10}

这将导致以下字典 d

    d = {('Event 1','Event 2'): {('','') : 30,
                                 ('A','') : 30,
                                 ('','B') : 10,
                                 ('','C') : 20,
                                 ('A','B') : 10,
                                 ('A','C') : 20},
          ('Event 1','Event 3'): {('','') : 50,
                                 ('D','') : 50,
                                 ('','C') : 50,
                                 ('D','C') : 50},
          ('Event 2','Event 3'): {('','') : 10,
                                 ('D','') : 10,
                                 ('','B') : 10,
                                 ('D','B') : 10}}               

有没有更快的方法来更新嵌套字典中具有相同值的一组键?

阿兰·T。

通过减少索引的数量,您可以节省大约30%的时间(取决于数据),但是鉴于生成的组合数量之多,我看不出如何使速度更快:

d = defaultdict(lambda:defaultdict(int))
for (events,features),count in help_d.items():
    counts = d[events]
    for combo in product(*zip(features, repeat(''))):
        counts[combo] += count

但是,取决于以后使用此词典的方式,仅在使用时生成计数可能会更有效。您可以通过创建为给定事件和功能组合实现“按需”计算的类或函数来实现。

help_events = defaultdict(list) # list of feature patterns for each event pair
for (event,features),count in help_d.items():
    help_events[event].append(features)

help_cache = dict() # cached results  
def getFeatureCount(events,pattern):
    # check cache first
    if (events,pattern) in help_cache:
        return help_cache[(events,pattern)]

    # compute total of matching feature patterns
    result   = 0
    for eventFeatures in help_events[events]:
        if all(e==f or f=="" for e,f in zip(eventFeatures,pattern)):
            result += help_d[(events,eventFeatures)]

    #save to cache and return result
    help_cache[(events,pattern)] = result
    return result

用法:

getFeatureCount(('Event 1', 'Event 2'),('Feature A', '')) # --> 30

# wich is equivalent to d[(('Event 1', 'Event 2'),('Feature A', ''))] 

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有一种有效的方法来从字典中检索值

来自分类Dev

有没有一种快速的方法来绘制Scilab中的多个图

来自分类Dev

有没有一种快速的方法来获取数组中的整个布尔值?

来自分类Dev

有没有一种优雅的方法来检查是否设置了一组环境变量?

来自分类Dev

有没有一种方便的方法来在ruby中构建嵌套哈希

来自分类Dev

有没有一种快速的方法来创建具有1和x * 0的向量?

来自分类Dev

有没有一种快速的方法来计算三个值的最大值

来自分类常见问题

有没有一种快速的方法来获取列表中的所有邻居元素?

来自分类Dev

有没有一种快速的方法来获取列表中的所有邻居元素?

来自分类Dev

有没有一种快速的方法来打开命令窗口

来自分类Dev

有没有一种快速而肮脏的方法来截断水线集合?

来自分类Dev

有没有一种快速而肮脏的方法来截断水线集合?

来自分类Dev

有没有一种有效的方法来搜索非常大的文件中的字典?

来自分类Dev

有没有一种“聪明”的方法来摆脱嵌套循环?

来自分类Dev

有没有一种好的方法来确保特定的switch语句处理所有枚举值?

来自分类Dev

有没有一种快速的方法来检查Clojure函数中的nil参数?

来自分类Dev

有没有一种快速的方法来在Python中获得ls()的R等效项?

来自分类Dev

有没有一种快速的方法来将C#中的结构归零?

来自分类Dev

有没有一种快速的方法来删除glibc中的malloc / free / memalign / realloc挂钩?

来自分类Dev

有没有一种快速的方法来清除工作表中的大量数据?

来自分类Dev

有没有一种快速的方法来从VBA中的Range获取列字母?

来自分类Dev

有没有一种简单的方法来增加 Map 对象值的值?

来自分类Dev

关系更改时,有没有一种很好的方法来更新NSManagedObject?

来自分类Dev

有没有一种方法来获取特定列上的日期差

来自分类Dev

一种更有效的方法来检查是否没有相关项目具有特定值

来自分类Dev

有没有一种方法来检查jOOQ查询绑定值?

来自分类Dev

有没有一种简单的方法来显示JavaFX中的提示文本?

来自分类Dev

有没有一种简单的方法来计时elisp中的函数调用?

来自分类Dev

有没有一种好的方法来冻结Javascript中的对象数组?

Related 相关文章

  1. 1

    有没有一种有效的方法来从字典中检索值

  2. 2

    有没有一种快速的方法来绘制Scilab中的多个图

  3. 3

    有没有一种快速的方法来获取数组中的整个布尔值?

  4. 4

    有没有一种优雅的方法来检查是否设置了一组环境变量?

  5. 5

    有没有一种方便的方法来在ruby中构建嵌套哈希

  6. 6

    有没有一种快速的方法来创建具有1和x * 0的向量?

  7. 7

    有没有一种快速的方法来计算三个值的最大值

  8. 8

    有没有一种快速的方法来获取列表中的所有邻居元素?

  9. 9

    有没有一种快速的方法来获取列表中的所有邻居元素?

  10. 10

    有没有一种快速的方法来打开命令窗口

  11. 11

    有没有一种快速而肮脏的方法来截断水线集合?

  12. 12

    有没有一种快速而肮脏的方法来截断水线集合?

  13. 13

    有没有一种有效的方法来搜索非常大的文件中的字典?

  14. 14

    有没有一种“聪明”的方法来摆脱嵌套循环?

  15. 15

    有没有一种好的方法来确保特定的switch语句处理所有枚举值?

  16. 16

    有没有一种快速的方法来检查Clojure函数中的nil参数?

  17. 17

    有没有一种快速的方法来在Python中获得ls()的R等效项?

  18. 18

    有没有一种快速的方法来将C#中的结构归零?

  19. 19

    有没有一种快速的方法来删除glibc中的malloc / free / memalign / realloc挂钩?

  20. 20

    有没有一种快速的方法来清除工作表中的大量数据?

  21. 21

    有没有一种快速的方法来从VBA中的Range获取列字母?

  22. 22

    有没有一种简单的方法来增加 Map 对象值的值?

  23. 23

    关系更改时,有没有一种很好的方法来更新NSManagedObject?

  24. 24

    有没有一种方法来获取特定列上的日期差

  25. 25

    一种更有效的方法来检查是否没有相关项目具有特定值

  26. 26

    有没有一种方法来检查jOOQ查询绑定值?

  27. 27

    有没有一种简单的方法来显示JavaFX中的提示文本?

  28. 28

    有没有一种简单的方法来计时elisp中的函数调用?

  29. 29

    有没有一种好的方法来冻结Javascript中的对象数组?

热门标签

归档