我有一点创造性的Python问题。我无法想出一个优雅而优选的简短方法来写这篇文章。
我有4个列表,其中3个有1个元素,第4个可能有更多(也可能是1个)。
我需要一个脚本,将这4个列表转换为一系列特定格式的字典。我举几个例子,我想做什么
例如:
W=['spaghetti']
X=['banana']
Y=['tomato']
Z=['lemonade', 'milk']
我需要这个:
dict1 = {'fruit':'banana' , 'food':'spaghetti' , 'vegetable':'tomato' , 'drink':'lemonade'}
dict2 = {'fruit':'banana' , 'food':'spaghetti' , 'vegetable':'tomato' , 'drink':'milk'}
但它也可以是3个或更多元素:
W=['spaghetti']
X=['banana']
Y=['tomato']
Z=['lemonade', 'milk', 'water']
对于这些,结果应该是:
dict1 = {'fruit':'banana' , 'food':'spaghetti' , 'vegetable':'tomato' , 'drink':'lemonade'}
dict2 = {'fruit':'banana' , 'food':'spaghetti' , 'vegetable':'tomato' , 'drink':'milk'}
dict3 = {'fruit':'banana' , 'food':'spaghetti' , 'vegetable':'tomato' , 'drink':'water'}
此外,除Z之外的另一个列表可以是多个元素列表:
W=['spaghetti']
X=['banana', 'apple']
Y=['tomato']
Z=['lemonade']
在这种情况下,我需要:
dict1 = {'fruit':'banana' , 'food':'spaghetti' , 'vegetable':'tomato' , 'drink':'lemonade'}
dict2 = {'fruit':'apple' , 'food':'spaghetti' , 'vegetable':'tomato' , 'drink':'lemonade'}
基本上是这样的:
答案 0 :(得分:2)
通常,您将获取列表的Cartesian product,并根据每个结果制作字典。由于您事先并不知道将会有多少结果,因此您不能只分配给dict1
,dict2
等等。(此外,应该已经很明显这是一个愚蠢的想法来自您正在使用的名称。毕竟,您没有写Z1 = 'lemonade'
; Z2 = 'milk'
等。请仔细考虑为什么不这样做。)相反,我们将对这些结果进行list
。
因此,对于我们通过采用笛卡尔坐标获得的每个list
,我们希望dict
包含(tuple
可以用tuple
表示的from itertools import product
# define W, X, Y, Z...
menus = [
{'fruit': fruit, 'food': food, 'vegetable': vegetable, 'drink': drink}
for fruit, food, vegetable, drink in product(W, X, Y, Z)
]
)产品。幸运的是,“采用笛卡尔积”是内置于标准库中的,它允许我们编写单个表达式(不包括导入;)),这意味着它所说的内容(本段的第一句):
{{1}}
此方法允许任何源列表包含多个元素(或没有元素;)),无需进行必要的修改。