【问题标题】:How to create a set of values from multiple list in Python如何在 Python 中从多个列表中创建一组值
【发布时间】:2021-11-24 20:02:22
【问题描述】:

我在config.json中有以下数据:

{
  "data1": [7, 8],
  "data2": [2015, 2016],
  "data3": [5, 10],
}

它有 3 个长度为 2 的列表,但它可以有多个长度为 n 的列表。我必须读取这些数据,然后创建一个列表列表,该列表应该包含所有值,就像设置一样。所以输出应该如下所示:

[
    [7, 2015, 5],
    [7, 2015, 10],
    [7, 2016, 5],
    [7, 2016, 10],
    [8, 2015, 5],
    [8, 2015, 10],
    [8, 2016, 5],
    [8, 2016, 10]
]


json_data = open("config.json")
config = json.load(json_data)
json_data.close()

data_list = []
for be in config["data1"]:
    for eof in config["data2"]:
        for bd in config["data3"]:
            data_list.append(bd)

但我无法理解如何修改数据以得到如上所示的输出。任何人都可以请给一些建议。请帮忙。谢谢

【问题讨论】:

  • 我有点困惑,列表的数量会是动态的,你想找到它们的每一个组合吗? 2项的长度([7,8])是静态的,还是动态的?
  • @ZaidAlShaattle 列表的长度是动态的,但我可以说列表的数量可以是静态的

标签: python json list


【解决方案1】:

你可以使用itertools.product:

list(it.product(*data.values()))

【讨论】:

  • 你的意思是我必须在一个 for 循环中运行它,data 将是来自配置文件的数据
  • 我假设 data 是您在问题中提供的示例字典。
【解决方案2】:

使用itertools.product 给出一系列迭代的笛卡尔积:

from itertools import product
data = {'data1': [7, 8], 'data2': [2015, 2016], 'data3': [5, 10]}
cprod = product(*data.values())
for cp in cprod:
    print(cprod)
(7, 2015, 5)
(7, 2015, 10)
(7, 2016, 5)
(7, 2016, 10)
(8, 2015, 5)
(8, 2015, 10)
(8, 2016, 5)
(8, 2016, 10)


【讨论】:

    【解决方案3】:

    这里有一些关于 a_guest 回答的信息,因为您似乎很难理解它。

    json_data = open("config.json")
    config = json.load(json_data)
    json_data.close()
    
    cproduct = list(itertools.product(*config.values()))
    

    product 函数将为您提供笛卡尔积,这正是您所需要的:来自不同集合的元素的所有可能组合。我们基本上使用它作为product(set_1, set_2, ..., set_n)

    这里,set_1 应该是使用 "data1" 键存储的列表,set_2 使用 "data2" 等等。所以你基本上可以写it.product(config['data1'], config['data2'], config['data3'])

    但是我们如何在不更改代码的情况下处理 json 中的新键呢?

    要实现这一点,guest_a 依赖于两件事:

    • config.values() 返回每​​个值的列表,因此在您的情况下,该列表包含 json 中定义的所有列表。这样,如果您将新的 "data4" 密钥添加到您的 json 文件中,您将获得新列表。

    • 解包* 操作符,它允许我们使用任何可迭代对象作为参数列表。

    所以基本上,it.product(*config.values()) 等价于it.product(config["data1"], ..., config["data_n"]),但更加灵活。

    【讨论】:

      【解决方案4】:

      你已经完成了所有的工作 只需添加

          data_list = []
          for be in config["data1"]:
              for eof in config["data2"]:
                  for bd in config["data3"]:
                      data_list.append([be,eof,bd])
      

      【讨论】:

        猜你喜欢
        • 2017-03-30
        • 2018-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多