我想在Python中生成列表对象的组合,并且正在研究itertools.product
或类似的函数来计算组合。由于itertools
.product从多个数组生成组合
我有一个看起来像这样的对象:
{
"Cities": [
{
"Id": 1,
"Value": "New York"
},
{
"Id": 2,
"Value": "Boston"
}
],
"People": [
{
"Id": 1,
"Value": "Michael"
},
{
"Id": 2,
"Value": "Ryan"
},
{
"Id": 3,
"Value": "Jim"
},
{
"Id": 4,
"Value": "Phyllis"
}
]
}
我想生成一个列表,以显示每个城市中生活的所有人群。因此,在上述情况下,将列出8个值。
我的以下代码如下:
import json
import itertools
def main():
combinations = []
with open('people.json') as f:
data = json.load(f)
combinations = list(itertools.product(*data))
print(combinations)
if __name__ == "__main__":
main()
运行时,我得到一个完全不同的结果:
如何修改代码以获得所需的结果?
注意:不必使用itertools
,我只是认为itertools
用于此类计算
当您执行时list(itertools.product(*data))
,将传递与product
您执行时看到的相同的事情:
for x in data:
print(x)
即,你做到了
itertools.product(['Cities', 'People'])
这就是为什么您在这两个字符串中得到字符乘积的原因(是鸭子输入!)
[
('C', 'P'),
('C', 'e'),
('C', 'o'),
('C', 'p'),
('C', 'l'),
('C', 'e'),
('i', 'P'),
('i', 'e'),
('i', 'o'),
('i', 'p'),
('i', 'l'),
('i', 'e'),
...
]
您使用的是product()
正确的,但是提供了错误的数据。
cities = [c['Value'] for c in data['Cities']] # Extract all cities Value from list-of-dicts
people = [c['Value'] for c in data['People']] # Extract all people Value from list-of-dicts
print(list(itertools.product(cities, people))) # Product
这给出了输出:
[
('New York', 'Michael'),
('New York', 'Ryan'),
('New York', 'Jim'),
('New York', 'Phyllis'),
('Boston', 'Michael'),
('Boston', 'Ryan'),
('Boston', 'Jim'),
('Boston', 'Phyllis')
]
如果您想要dict
对象而不是Value
键,则只需将这些对象传递给product()
:
print(list(itertools.product(data['Cities'], data['People']))) # Product
这使
[
({'Id': 1, 'Value': 'New York'}, {'Id': 1, 'Value': 'Michael'}),
({'Id': 1, 'Value': 'New York'}, {'Id': 2, 'Value': 'Ryan'}),
({'Id': 1, 'Value': 'New York'}, {'Id': 3, 'Value': 'Jim'}),
({'Id': 1, 'Value': 'New York'}, {'Id': 4, 'Value': 'Phyllis'}),
({'Id': 2, 'Value': 'Boston'}, {'Id': 1, 'Value': 'Michael'}),
({'Id': 2, 'Value': 'Boston'}, {'Id': 2, 'Value': 'Ryan'}),
({'Id': 2, 'Value': 'Boston'}, {'Id': 3, 'Value': 'Jim'}),
({'Id': 2, 'Value': 'Boston'}, {'Id': 4, 'Value': 'Phyllis'})
]
如预期的那样。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句