更好的方法来执行嵌套for循环来生成一个dict?

时间:2015-01-28 23:58:10

标签: python

有没有更好的方法在python中生成列表字典,包含列表中的值,而不是使用嵌套的for循环?

示例:

alphabet = ['a', 'b', 'c', 'd', 'e', 'f', ... ,'z']
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
chars = ["!", "@", "#", "$"]

objects = []
for letter in alphabet:
    for number in numbers:
        for char in characters:
            objects.append({
                'letter': letter,
                'number': number,
                'char': char
            })

print objects
# [{letter: 'a', 'number': 0, 'char':'!'}, {letter: 'a', 'number': 0, 'char':'@'}, ...

我正在试图弄清楚如何制作包含三个列表的每个组合的dicts列表。在上面的示例中使用嵌套的for循环,这是26 x 10 x 4循环。我查看了使用zip,但只合并了列表,并没有给出每个独特的组合。

是否有一种pythonic方法可以比26 x 10 x 4循环更快地完成它?

有没有办法通过发电机懒洋洋地完成这项工作?如果是这样,怎么样?

4 个答案:

答案 0 :(得分:3)

有趣的是它是itertools.product

import itertools
alphabet = ['a', 'b', 'c', 'd', 'e', 'f','z']
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
chars = ["!", "@", "#", "$"]
my_iter = itertools.product(alphabet,numbers,chars)
my_keys = "letter number char".split()
for data in my_iter:
    print dict(zip(my_keys,data))

答案 1 :(得分:3)

您可以使用itertools.product计算所有提供的迭代物之间的笛卡尔积:

import itertools
import string

for letter, number, char in itertools.product(string.ascii_lowercase, string.digits, string.punctuation):
    print({'letter': letter, 'number': number, 'char': char})

答案 2 :(得分:2)

生产您要求的发电机:

from itertools import product

alphabet = ['a', 'b', 'c', 'd', 'e', 'f', ... ,'z']
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
chars = ["!", "@", "#", "$"]

combinations = product(alphabet, numbers, chars)
generator = ({'letter': l, 'number': n, 'char': c} for l, n, c in combinations)

由于这是一个生成器,因此仅在需要时对其进行评估:

list(generator)

答案 3 :(得分:0)

from flask_sqlalchemy import SQLAlchemy