如果我得到这样的输入:
[
{
"name": "Robert",
"city": "New York",
"short": "Bob"
},
{
"name": "Allison",
"city": "Los Angeles",
"short": "Ally"
},
{
"name": "James",
"city": "Chicago",
"short": "Jim"
},
{
"name": "Hannah",
"city":"Toronto",
},
{
"name": "Elizabeth",
"city": "London",
}
]
我将如何生成这样的输出,在其中获得所有可能的组合?
[
{"Robert": "New York", "Allison": "Los Angeles", "James": "Chicago", "Hannah": "Toronto", "Elizabeth": "London"},
{"Bob": "New York", "Allison": "Los Angeles", "James": "Chicago", "Hannah": "Toronto", "Elizabeth": "London"},
{"Robert": "New York", "Ally": "Los Angeles", "James": "Chicago", "Hannah": "Toronto", "Elizabeth": "London"},
{"Bob": "New York", "Ally": "Los Angeles", "James": "Chicago", "Hannah": "Toronto", "Elizabeth": "London"},
{"Robert": "New York", "Allison": "Los Angeles", "Jim": "Chicago", "Hannah": "Toronto", "Elizabeth": "London"},
{"Bob": "New York", "Allison": "Los Angeles", "Jim": "Chicago", "Hannah": "Toronto", "Elizabeth": "London"},
{"Robert": "New York", "Ally": "Los Angeles", "Jim": "Chicago", "Hannah": "Toronto", "Elizabeth": "London"},
{"Bob": "New York", "Ally": "Los Angeles", "Jim": "Chicago", "Hannah": "Toronto", "Elizabeth": "London"},
]
StackOverflow家族请帮忙。
最佳答案
我认为您正在寻找的是采用笛卡尔积,而不是您可以为每个人获得的每个可能的名称-城市对的组合。即这些列表的笛卡尔积:
[('Robert', 'New York'), ('Bob', 'New York')]
[('Allison', 'Los Angeles'), ('Ally', 'Los Angeles')]
[('James', 'Chicago'), ('Jim', 'Chicago')]
[('Hannah', 'Toronto')]
[('Elizabeth', 'London')]
<小时/>
您需要的第一件事是一个将人名-城市短字典转换为姓名-城市/短城市对列表的函数:
def pairs(person):
names = [(person['name'], person['city'])]
try:
names.append((person['short'], person['city']))
except KeyError:
pass
return names
现在,您需要将其应用于具有 map
或理解的每个人:
allpairs = map(pairs, people)
现在您有了可以调用产品的东西:
results = itertools.product(*allpairs)
现在你只需要把每个对的列表变成一个字典:
output = [dict(result) for result in results]
然后你必须编写代码将它们按照你想要的奇怪顺序排列(也许你只是想反向生成它们然后反转它?),并以看起来有点像的格式输出它Python dict repr 或 JSON 对象,但实际上都不是。 (此外,如果每个字典的顺序很重要,并且您没有使用 Python 3.7 或更高版本,则需要使用 collections.OrderedDict
而不是 dict
。 )
关于javascript - 创建 JSON 对象的排列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51913744/