【问题标题】:Iterate over a dictionary? [closed]遍历字典? [关闭]
【发布时间】:2018-05-18 21:49:37
【问题描述】:

如何实现以下对字典的遍历?

a = {'Source_1': [1, 2], 'Source_2': [7, 8, 9, 10], 'Source_3': [11, 12, 13, 14]...}

If Source_1 takes 1, Source_2 takes 7, Source_3 takes 11, ..., do something
If Source_1 takes 1, Source_2 takes 7, Source_3 takes 12, ..., do something
If Source_1 takes 1, Source_2 takes 7, Source_3 takes 13, ..., do something
  ... etc
If Source_1 takes 2, Source_2 takes 10, Source_3 takes 14, ..., do something

【问题讨论】:

  • 不清楚你在问什么,你能清理你的代码并在你期望的输出中添加细节吗?
  • 发布您目前拥有的代码可能会有所帮助。
  • 你所说的“接受”是什么意思? Source_1 映射到一个包含 1 和 2 的列表。您要检查另一个变量 x 的值是否在a['Source_1']包含
  • 或者你想要for x in itertools.product(*a.values()): do_something(x)这样的东西吗?
  • 我有一个不确定性的优化问题。字典 a 的键给出了这些不确定性的名称,即我模型中不确定性的定位器)。字典的值给出了这些不确定性的所有可能结果。对于每个结果,我解决了一个不同的优化问题。例如,考虑以下优化问题,F(\xi, \mu) = Min (\xi * x + \mu * y),其中 \xi 和 \mu 是随机变量,x 和 y 是决策变量。那么字典 a 就像 {"x" : [1,2], "y": [3,4,5] }。我需要分别求解F(1,3), F(1,4), F(1,5)...F(2,5)。

标签: python dictionary iterator


【解决方案1】:

如果您想要遍历值中包含的所有元素组合,则itertools.product 相当于任意深度的嵌套 for 循环。

import itertools

a = {'Source_1': [1, 2], 'Source_2': [3, 4], 'Source_3': [5]}

for x in itertools.product(*a.values()):
    print(x)

哪些打印:

(1, 3, 5)
(1, 4, 5)
(2, 3, 5)
(2, 4, 5)

虽然请注意在 Python 3.6 之前,字典值没有排序。这意味着上面的输出可能没有明确定义。

因此,如果您使用的是上述版本之前的版本,那么字典可能是数据结构的错误选择。

不过,如果您致力于使用字典,您可以按照您希望它们出现的顺序对值进行排序。例如,如果您希望它们按您的字典键排序,以下将确保您获得正确的排序。

for x in itertools.product(*map(lambda x: x[1], sorted(a.items()))):
    print(x)

【讨论】:

  • 不过,它将在 Python 3.7 中(如果您使用 CPython,则在 Python 3.6 中)。
  • @J.Lin 你在用 Python 3.6+ 吗?
  • 要获得正确的顺序,您可以使用其键明确获取值:src1, src2, src3 = a['Source_1'],a['Source_2'],a['Source_3'], 然后获取产品。
  • @chepner 我正在尝试使其可用于 Python 3+。有什么办法可以解决这个问题?
  • @J.Lin 我的意思是,在 Python 3.6 之前,您不能按创建的顺序遍历键,Python 只是不能在之前3.6.
猜你喜欢
  • 2021-05-20
  • 1970-01-01
  • 2017-05-06
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多