Python:如何将这些列表转换为字典?

时间:2013-12-29 15:01:39

标签: python list dictionary

我有一点创造性的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'}

基本上是这样的:

  • 给定:
    • 3个1元素列表
    • 1个元素列表
  • 结果:
    • n具有4个键值对的dictioraries:每个列表中有1个键值对
    • 与1元素列表对应的键的相同dict值
    • 与n元素列表对应的键的不同dict值

1 个答案:

答案 0 :(得分:2)

通常,您将获取列表的Cartesian product,并根据每个结果制作字典。由于您事先并不知道将会有多少结果,因此您不能只分配给dict1dict2等等。(此外,应该已经很明显这是一个愚蠢的想法来自您正在使用的名称。毕竟,您没有写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}}

此方法允许任何源列表包含多个元素(或没有元素;)),无需进行必要的修改。