【问题标题】:Cartesian product giving a dictionary给字典的笛卡尔积
【发布时间】:2014-08-18 11:35:06
【问题描述】:

我有以下列表:

brand=["Audi","Mercedes"]
speed=[130,150]
model=["sport","family"]

我想获得相当于:

ll=[]
ll.append({'brand':'mercedes', 'speed':130, 'model':'family'})
ll.append({'brand':'mercedes', 'speed':130, 'model':'sport'})
ll.append({'brand':'audi', 'speed':130, 'model':'family'})
ll.append({'brand':'audi', 'speed':130, 'model':'sport'})
ll.append({'brand':'mercedes', 'speed':150, 'model':'family'})
ll.append({'brand':'mercedes', 'speed':150, 'model':'sport'})
ll.append({'brand':'audi', 'speed':150, 'model':'family'})
ll.append({'brand':'audi', 'speed':150, 'model':'sport'})

我目前这样做:

from itertools import product
ll=list(product(speed, model, brand))

我有所有需要的组合,但这只是一个列表列表而不是字典列表。不知道有没有直接pythonic的方式来做!

【问题讨论】:

    标签: python dictionary itertools


    【解决方案1】:

    用键压缩你的值:

    keys = 'brand', 'speed', 'model'
    
    ll = [dict(zip(keys, combo)) for combo in product(brand, speed, model)]
    

    演示:

    >>> from itertools import product
    >>> from pprint import pprint
    >>> brand = ["Audi", "Mercedes"]
    >>> speed = [130, 150]
    >>> model = ["sport", "family"]
    >>> keys = 'brand', 'speed', 'model'
    >>> [dict(zip(keys, combo)) for combo in product(brand, speed, model)]
    [{'speed': 130, 'brand': 'Audi', 'model': 'sport'}, {'speed': 130, 'brand': 'Audi', 'model': 'family'}, {'speed': 150, 'brand': 'Audi', 'model': 'sport'}, {'speed': 150, 'brand': 'Audi', 'model': 'family'}, {'speed': 130, 'brand': 'Mercedes', 'model': 'sport'}, {'speed': 130, 'brand': 'Mercedes', 'model': 'family'}, {'speed': 150, 'brand': 'Mercedes', 'model': 'sport'}, {'speed': 150, 'brand': 'Mercedes', 'model': 'family'}]
    >>> pprint(_)
    [{'brand': 'Audi', 'model': 'sport', 'speed': 130},
     {'brand': 'Audi', 'model': 'family', 'speed': 130},
     {'brand': 'Audi', 'model': 'sport', 'speed': 150},
     {'brand': 'Audi', 'model': 'family', 'speed': 150},
     {'brand': 'Mercedes', 'model': 'sport', 'speed': 130},
     {'brand': 'Mercedes', 'model': 'family', 'speed': 130},
     {'brand': 'Mercedes', 'model': 'sport', 'speed': 150},
     {'brand': 'Mercedes', 'model': 'family', 'speed': 150}]
    

    【讨论】:

      猜你喜欢
      • 2017-10-16
      • 2011-07-10
      • 2023-03-17
      • 2018-11-09
      • 2017-08-24
      • 2019-02-10
      • 1970-01-01
      • 2019-07-23
      • 2022-01-24
      相关资源
      最近更新 更多