如何在Python中从多个列表中创建一组值



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

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

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

[
[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)

但是我无法理解我如何修改数据以获得如上的输出。谁能给点建议?请帮助。由于

您可以使用itertools.product:

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

使用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)

这里是关于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中定义的所有列表的列表。这样,如果您在json文件中添加新的"data4"键,您将获得新的列表。

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

基本上,it.product(*config.values())相当于it.product(config["data1"], ..., config["data_n"]),但更灵活。

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

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

最新更新