Julia - 迭代字典中的键组合

2024-04-11

有没有一种巧妙的方法来迭代字典中的键组合?

我的字典有这样的值:

[1] => [1,2], [2,3] => [15], [3] => [6,7,8], [4,9,11] => [3], ... 

我需要做的是获取所有长度的键组合1:n where n可能是FX 3

就像上面的例子一样,我想迭代

[[1], [3], [2,3], [[1],[1,2]], [[3],[2,3]], [4,9,11]]

我知道我可以收集密钥,但我的字典相当大,我正在重新设计整个算法,因为当它开始疯狂交换时n > 3,效率大大降低

tl;dr有没有一种方法可以从字典创建组合迭代器而无需collect-查字典吗?


以下是一个直接的实现,它试图尽量减少对字典的查询。此外,它使用 OrderedDict,因此保留键索引是有意义的(因为 Dict 不保证每次都保持一致的键迭代,从而保证有意义的键索引)。

using Iterators
using DataStructures

od = OrderedDict([1] => [1,2], [2,3] => [15], [3] => [6,7,8], [4,9,11] => [3])

sv = map(length,keys(od))        # store length of keys for quicker calculations
maxmaxlen = sum(sv)              # maximum total elements in good key
for maxlen=1:maxmaxlen           # replace maxmaxlen with lower value if too slow
  @show maxlen
  gsets = Vector{Vector{Int}}()  # hold good sets of key _indices_
  for curlen=1:maxlen
    foreach(x->push!(gsets,x),
     (x for x in subsets(collect(1:n),curlen) if sum(sv[x])==maxlen))
  end
  # indmatrix is necessary to run through keys once in next loop
  indmatrix = zeros(Bool,length(od),length(gsets))
  for i=1:length(gsets)              for e in gsets[i]
      indmatrix[e,i] = true
    end
  end
  # gkeys is the vector of vecotrs of keys i.e. what we wanted to calculate
  gkeys = [Vector{Vector{Int}}() for i=1:length(gsets)]
  for (i,k) in enumerate(keys(od))
    for j=1:length(gsets)
      if indmatrix[i,j]
        push!(gkeys[j],k)
      end
    end
  end
  # do something with each set of good keys
  foreach(x->println(x),gkeys)
end

这比您目前的效率更高吗?最好将代码放入函数中或将其转换为 Julia 任务,该任务在每次迭代时生成下一个键集。

- - 更新 - -

使用有关任务中迭代器的答案https://stackoverflow.com/a/41074729/3580870 https://stackoverflow.com/a/41074729/3580870

改进的迭代器版本是:

function keysubsets(n,d)
  Task() do
    od = OrderedDict(d)
    sv = map(length,keys(od))        # store length of keys for quicker calculations
    maxmaxlen = sum(sv)              # maximum total elements in good key
    for maxlen=1:min(n,maxmaxlen)    # replace maxmaxlen with lower value if too slow
      gsets = Vector{Vector{Int}}()  # hold good sets of key _indices_
      for curlen=1:maxlen
        foreach(x->push!(gsets,x),(x for x in subsets(collect(1:n),curlen) if sum(sv[x])==maxlen))
      end
      # indmatrix is necessary to run through keys once in next loop
      indmatrix = zeros(Bool,length(od),length(gsets))
      for i=1:length(gsets)              for e in gsets[i]
          indmatrix[e,i] = true
        end
      end
      # gkeys is the vector of vecotrs of keys i.e. what we wanted to calculate
      gkeys = [Vector{Vector{Int}}() for i=1:length(gsets)]
      for (i,k) in enumerate(keys(od))
        for j=1:length(gsets)
          if indmatrix[i,j]
            push!(gkeys[j],k)
          end
        end
      end
      # do something with each set of good keys
      foreach(x->produce(x),gkeys)
    end
  end
end

现在可以通过这种方式迭代所有键子集,直到组合大小为 4(在运行其他 StackOverflow 答案中的代码之后):

julia> nt2 = NewTask(keysubsets(4,od))
julia> collect(nt2)
10-element Array{Array{Array{Int64,1},1},1}:
 Array{Int64,1}[[1]]          
 Array{Int64,1}[[3]]          
 Array{Int64,1}[[2,3]]        
 Array{Int64,1}[[1],[3]]      
 Array{Int64,1}[[4,9,11]]     
 Array{Int64,1}[[1],[2,3]]    
 Array{Int64,1}[[2,3],[3]]    
 Array{Int64,1}[[1],[4,9,11]] 
 Array{Int64,1}[[3],[4,9,11]] 
 Array{Int64,1}[[1],[2,3],[3]]

(来自链接的 StackOverflow 答案的 NewTask 的定义是必要的)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Julia - 迭代字典中的键组合 的相关文章

  • 从 Map 中找出给定值的键的更快方法?

    我想从 HashMap 中找出给定值的键 目前我必须遍历所有键并检查其在映射中的值 有没有更快的方法 用于执行此操作的替代数据结构是BiMap来自谷歌集合 API API 文档是here http google collections go
  • Hibernate:将多对多映射到 Map

    我正在开发一个处理以下两个实体的应用程序 Products 我们将其命名为 X Y Z 并且材料 a b c 众所周知 每种产品都有一个配方 表明制造该产品所需的材料 例如 要生成 1 个 X 我们需要 2 个 a 6 个 c 和 4 个
  • 从 Julia 中的文本文件读取数据矩阵

    我有一个包含矩阵的文本文件 我想在朱莉娅中将其作为矩阵来阅读 文本文件如下 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 1 0 在 matlab 中 您可以执行以下操作来创建矩阵M
  • 如何给DArray的元素设置值?

    我正在探索 Julia 的并行计算并尝试了以下方法 a dzeros 5 a 1 5 但刚刚收到此错误 setindex not defined for DArray Float64 1 Array Float64 1 嗯 我以为手册上说s
  • Pentaho CE 上的地图可视化

    我正在运行 Pentaho ce 5 3 我已经使用星型模式立方体对其进行了测试 并且工作正常 现在我想将 Postgis 中存储的维度 包括空间维度 的 mdx 查询可视化为地图 不知道是否可行 或者我应该为此添加任何插件吗 根据您想要可
  • 我应该在 Python 字典上使用“has_key()”还是“in”? [复制]

    这个问题在这里已经有答案了 Given gt gt gt d a 1 b 2 以下哪一项是检查是否存在的最佳方法 a is in d gt gt gt a in d True gt gt gt d has key a True in绝对更P
  • 在 Scala 中将 Map[String, String] 转换为 Map[String, Int]

    我有一个 Map 其中键是 String 值是 Int 但表示为 String scala gt val m Map a gt 1 b gt 2 c gt 3 m scala collection immutable Map String
  • Python:使用 FOR 循环插入字典

    我已经在论坛中进行了搜索 但不明白是否可以使用以下构造将新条目插入到我的 Python 字典中 而不将其转换为列表 for x in range 3 pupils dictionary new key input Enter new key
  • 从 Json Python 获取特定字段值

    我有一个 JSON 文件 我想做的是获取这个特定字段 id 问题是当我使用json load input file 它说我的变量data是一个列表 而不是字典 所以我不能做类似的事情 for value in data id print d
  • 如何在书架中取出整数钥匙?

    我想在架子上存储一个整数密钥 但是当我尝试将整数密钥存储在搁置中时 它给了我一个错误 Traceback most recent call last File write py line 12 in data id Id id Name n
  • 如何在Python中创建具有重复键的嵌套字典

    我想使用嵌套字典和重复键创建数据结构 一个详细的例子是 data State1 Landon abc Area BOB data State1 Landon abc Area SAM data State1 Landon xyz Area
  • 检测 Android 中 OSM Mapview 是否仍在加载

    我已将 Open Street Maps 包含在我的 Android 应用程序中 在地图视图中 用户应该能够在地图完全加载后捕获屏幕 但目前 即使地图视图仍在加载 用户也可以捕获图像 有人可以告诉我如何检测地图视图何时完全加载吗 下面是我加
  • 为什么 .Net 词典中的条目是按加法顺序排列的?

    我刚刚看到这种行为 我对此感到有点惊讶 如果我向字典中添加 3 或 4 个元素 然后执行 For Each 来获取所有键 它们将以我添加的顺序出现 这让我感到惊讶的原因是字典内部应该是一个哈希表 所以我希望事情能以任何顺序出现 按键的哈希排
  • 什么时候会在 dict 上使用键值对作为 dict.update 方法?

    我注意到你可以做两件事来更新字典 并且它们似乎有相同的结果 a a update foo 1 a a update foo 1 两者都会产生如下所示的字典结果 foo 1 是否有任何理由更喜欢使用字典或键 值对作为更新方法 它们在功能上是否
  • 估算缺失数据,同时强制相关系数保持不变

    考虑以下 excel 数据集 m r 2 0 3 3 0 8 4 0 1 3 2 1 5 2 2 3 1 9 2 5 1 2 3 0 2 0 2 6 我的目标是使用以下条件填充缺失值 将上述两列之间的成对相关性表示为 R 大约 0 68 将
  • 从两个字典创建一个新列表

    这是一个关于Python的问题 我有以下字典列表 listA t 1 tid 2 gtm 3 c1 4 id 111 t 3 tid 4 gtm 3 c1 4 c2 5 id 222 t 1 tid 2 gtm 3 c1 4 c2 5 id
  • 仅在满足条件时添加到字典

    我在用urllib urlencode构建 Web POST 参数 但是有一些值我只想在除None为他们而存在 apple green orange orange params urllib urlencode apple apple or
  • 为什么 Julia 中的“where”语法对换行符敏感?

    在 Stack Overflow 上的另一个问题中 答案包括以下函数 julia gt function nzcols b SubArray T 2 P Tuple UnitRange Int64 UnitRange Int64 where
  • dict_values 视图什么时候可以像设置一样(以及为什么)?

    文档说值视图不被视为类似集合 https docs python org 3 library stdtypes html dictionary view objects 但有时它们是 gt gt gt d 1 1 gt gt gt d va
  • 在地图上使用 find

    如何使用 find 和 aconst iterator如果你有一个地图定义为 typedef std pair

随机推荐

  • 即使应用程序处于非活动状态,CursorLoader 如何自动更新视图?

    我一直在开发一个小型待办事项列表应用程序 我使用 CursorLoader 从内容提供商更新 ToDolistview 我写了一个函数onNewItemAdded 当用户在文本视图中输入新项目并单击 Enter 时调用 参考如下 publi
  • 在同一 pandas 数据框中交换两行(连同索引)

    我正在制定固定转售价格dataset https data gov sg dataset resale flat prices 如果您有兴趣 我使用的是 2015 年 1 月以后的数据 First I group the data by u
  • 单击警报消息中的“确定”后如何关闭浏览器中的当前窗口?

    基于页面中的某些操作 我想向用户发出警报消息 即 您的简历已上传 当用户在该警报框中单击 确定 时 我想关闭该窗口 我想仅使用警报方法而不是 JavaScript 中的确认方法来执行此操作 为什么 因为警报方法给出了唯一的选项 确定 而确认
  • MOVE-TO 期望输入是代理,但得到的是 NOBODY

    我的代码所做的是设置一个内部灰色补丁区域和一个外部黑色补丁区域 海龟可以在其中繁殖 每个补丁上有一个 一旦乌龟到达灰色和黑色区域之间的边界 我就会分配可变能量 以将乌龟的繁殖延迟一定的刻度 每个刻度能量增长一个单位 当能量达到一定数量时 我
  • 无法编译使用 boost 中的 odeint 的 C++

    我使用的是 Ubuntu 12 04 并且 usr include 中已经有一些 boost fies 我做了一个 sudo apt get install libboost all dev 并且还安装了很多文件 我不想删除这个 boost
  • 多个 JSlider 相互反应始终等于 100%

    我正在尝试向 java swing 应用程序添加 3 个 JSlider 以便三个滑块的总价值总和为 100 每个滑块都是一个概率 滑块 A 是将值添加到队列的概率 滑块 B是从队列中删除某个值的概率 滑块 C 是什么都不发生的概率 示例
  • img 标签中的 SVG 未在 Firefox 中作为图像加载

    我正在尝试使用 img 标签加载我的 svg 文件 但它在 Firefox 上不起作用 Chrome 显示 svg 我正在尝试这样做http www schepers cc svg blendups embedding html http
  • matplotlib 颜色条不起作用(由于垃圾收集?)

    我有一个与此类似的绘图功能 def fct f figure ax f add subplot 111 x y mgrid 0 5 0 5 z sin x 2 y 2 ax pcolormesh x y z 当我在中定义上面的函数时ipyt
  • iPhone 应用程序:应用程序进入 App Store 之前在特定设备上进行 Beta 测试

    我在App程序门户中注册了2台设备 只有我有一台 Mac 和设备才能下载该应用程序进行测试 另一个用户没有 Mac 但他有一部 iPhone 其他用户是否可以下载该应用程序进行测试 以便我们可以在将该应用程序发布到 App Store 上供
  • 根据日期条件之间另一列中的条件计算唯一文本值

    我需要的是根据 FIAP Medium Year 列的标准计算 TITLE 中唯一值的公式 这需要首先查看工作表 M Year 列中的日期 范围为2013年3月23日 2016年6月1日 然后需要检查 I FIAP Medium 列来寻找
  • AWS Lambda 与依赖项打包

    进一步概述是在 NodeJS 和 Monorepo 基于 Lerna 的背景下进行的 我有 AWS 堆栈 其中通过 AWS CloudFormation 部署了多个 AWS Lambda 一些 lambda 很简单 单个小模块 并且可以内联
  • iPhone/iPad:如何以编程方式获取屏幕宽度?

    您好 我想知道是否有办法以编程方式获取宽度 我正在寻找足够通用的东西来容纳 iphone 3gs iphone 4 ipad 此外 宽度应根据设备是纵向还是横向 对于 ipad 进行更改 有人知道该怎么做吗 我已经找了一段时间了 谢谢 看一
  • NHibernate:无法解析继承的 id 属性

    我定义了以下实体 public class Foo Entity
  • C# 裁剪然后缩放裁剪后的图像

    我正在尝试构建此类 在 ASP NET 站点中使用 它将裁剪给定自定义宽度 高度 X Y 的图像 然后获取结果图像并将其缩放为自定义宽度 高度 并保存在服务器返回该图像的 url 我将在查询字符串中获取这些参数 如下所示 Default a
  • 在python中将标题写入excel文件

    如何循环遍历列表中的每个元素并将其作为 Excel 标题 如果有重复的问题 请告诉我 到目前为止我还没找到 row 0 col 0 j 0 title No Hue Saturation Value Lightness AComponent
  • 过滤 ObservableCollection?

    当我将 ListBox 直接绑定到 ObservableCollection 时 我会在 ListBox 中显示实时更新 但是一旦我在混合中添加其他 LINQ 方法 我的 ListBox 就不再收到 ObservableCollection
  • 如何告诉 CPAN make 和 cc 的路径

    使用 opencsw org 软件包在 Solaris 上运行 Perl 5 10 CPAN 软件包中的 Makefile PL 无法找到正确的路径和 cc gcc 我找到了make的路径并将其设置为gmake 但我找不到cc的任何设置 我
  • bash while 循环没有按预期工作

    我知道从技术上讲 它可能会按原样工作 并且这是人们所期望的bash语言 但这不是我所期望和写的 我试图让一切尽可能简单 This is fileA Name Status Networks Image Plans HostName A PA
  • Google App Engine 数据存储区索引上限

    有人可以用简单的英语解释一下数据存储中 5000 个索引的上限吗 这是否意味着存储对象的索引列表属性不能包含超过 5000 个元素 数据存储区限制单个实体可以拥有的索引条目数量 此限制设置为每个实体 5000 个元素 您可以使用以下命令轻松
  • Julia - 迭代字典中的键组合

    有没有一种巧妙的方法来迭代字典中的键组合 我的字典有这样的值 1 gt 1 2 2 3 gt 15 3 gt 6 7 8 4 9 11 gt 3 我需要做的是获取所有长度的键组合1 n where n可能是FX 3 就像上面的例子一样 我想