javascript - 创建 JSON 对象的排列?

标签 javascript python json recursion

如果我得到这样的输入:

[
    {
        "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/

相关文章:

json - 如何在Elasticsearch中通过两个子句过滤数据?

c# - RestSharp:反序列化 json 字符串

javascript - 在相对 div 内部/外部居中绝对 div

javascript - 如何在react组件中使用现有的javascript代码

python - Pandas 合并 300 个数据帧

c# - 使用 Python 与 C# 创建 PPT 演示文稿

javascript - window.print() CSS 未在打印预览中加载

javascript - 如果地理编码器返回 ZERO_RESULTS, map API v3 获取半径内最近的位置

python - 在Sparql中查询字母mu

python - 在 Flask 中实现 MongoDB 搜索引擎 API