执行嵌套循环以生成字典的更好方法



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':'@'}, ...

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

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

有没有办法通过生成器懒惰地完成此操作? 如果是这样,如何?

您可以使用

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})

有趣的是,它是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))

要生成您请求的生成器:

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)
from itertools import product
from collections import Counter
for _ in range(int(input())):
    n = int(input())
    generator = [a+b for a,b in product(list(range(1,n+1)),list(range(1,n+1)))]
    c = Counter(generator)
    h=0
    print(c)
    for k in c:
        print(k)
    print(h)

最新更新