压缩两个不同大小的列表来制作词典

时间:2018-01-21 21:11:29

标签: python list dictionary

我有以下两种不同大小的列表,并希望使用zip()函数将它们组合到字典中。

stocks = ['CAT', 'IBM', 'MSFT']
prices = [20, 30, 40, 21, 31, 41, 22, 32, 42, 23, 33, 43]

以下是我要做的事情:

from itertools import cycle
ziplist = []
ziplist.append(dict(zip(cycle(stocks), prices)))

我的输出为:

[{'CAT': 23, 'IBM': 33, 'MSFT': 43}]

我的预期输出应该是一个包含多个dicts的列表:

[{'CAT': 20, 'IBM': 30, 'MSFT': 40}, {'CAT': 21, 'IBM': 31, 'MSFT': 41}, {'CAT': 22, 'IBM': 32, 'MSFT': 42}, {'CAT': 23, 'IBM': 33, 'MSFT': 43}]

3 个答案:

答案 0 :(得分:3)

使用cycle不允许您查看分部。而是循环可计算的长度。您可以使用迭代器来跟踪价格表中的位置:

代码:

prices_iter = iter(prices)
data = [dict(zip(stocks, prices_iter)) for i in range(len(prices) // len(stocks))]

测试代码:

stocks = ['CAT', 'IBM', 'MSFT']
prices = [20, 30, 40, 21, 31, 41, 22, 32, 42, 23, 33, 43]

prices_iter = iter(prices)
data = [dict(zip(stocks, prices_iter)) for i in range(len(prices) // len(stocks))]

print(data)

结果:

[
    {'IBM': 30, 'MSFT': 40, 'CAT': 20}, 
    {'IBM': 31, 'MSFT': 41, 'CAT': 21}, 
    {'IBM': 32, 'MSFT': 42, 'CAT': 22}, 
    {'IBM': 33, 'MSFT': 43, 'CAT': 23}
]

答案 1 :(得分:2)

也许这个?

stocks = ['CAT', 'IBM', 'MSFT']
prices = [20, 30, 40, 21, 31, 41, 22, 32, 42, 23, 33, 43]

[dict(zip(stocks,prices[i:i+len(stocks)])) for i in range(0,len(prices),len(stocks))]

答案 2 :(得分:2)

prices创建一个迭代器,然后构建子目录适当的次数,一次选择next的值:

stocks = ['CAT', 'IBM', 'MSFT']
prices = [20, 30, 40, 21, 31, 41, 22, 32, 42, 23, 33, 43]

price_iter = iter(prices)

result = [{x:next(price_iter,0) for x in stocks} for _ in range(len(prices)//len(stocks)) ]

(在这种情况下,如果prices太短,next会因为第二个参数而将0作为默认值)