使用itertools库获取对象组合?

如何解决使用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()

运行时,我得到一个完全不同的结果:

enter image description here

如何修改代码以获得所需的结果?

注意:不必使用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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?