如何解决使用itertools库获取对象组合?
我想用Python生成列表对象的组合,并正在研究itertools.product
或类似函数来计算组合。由于itertools
。product从多个数组生成组合
{
"Cities": [
{
"Id": 1,"Value": "New York"
},{
"Id": 2,"Value": "Boston"
}
],"People": [
{
"Id": 1,"Value": "Michael"
},"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
用于此类计算
解决方法
要使用所显示的数据执行您描述的工作,此脚本将执行此操作:
import json
import itertools
def main():
combinations = []
with open('people.json') as f:
data = json.load(f)
combinations = list(itertools.product(data['Cities'],data['People']))
print(combinations)
if __name__ == "__main__":
main()
唯一的区别是,我从数据结构中指定要使用的数据。
输出(为了方便阅读,我对其进行了格式化):
[
({"Id": 1,"Value": "New York"},{"Id": 1,"Value": "Michael"}),({"Id": 1,{"Id": 2,"Value": "Ryan"}),{"Id": 3,"Value": "Jim"}),{"Id": 4,"Value": "Phyllis"}),({"Id": 2,"Value": "Boston"},"Value": "Phyllis"})
]
如果您想在数据集中的任何键之间执行product
,则可以执行itertools.product(data.values())
,但是我显示的代码更加清晰。
为什么要得到输出:
执行list(itertools.product(*data))
时,与执行操作时看到的内容相同的东西也会传递到product
:
for x in data:
print(x)
即,你做到了
itertools.product(['Cities','People'])
这就是为什么您在这两个字符串中得到字符乘积的原因(是鸭子输入!)
[
('C','P'),('C','e'),'o'),'p'),'l'),('i',...
]
如何获取所需的输出:
您正确使用了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'),'Jim'),'Phyllis'),('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,{'Id': 2,'Value': 'Ryan'}),{'Id': 3,'Value': 'Jim'}),{'Id': 4,'Value': 'Phyllis'}),({'Id': 2,'Value': 'Boston'},'Value': 'Phyllis'})
]
符合预期。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。