【问题标题】:Correct generation of words in python在python中正确生成单词
【发布时间】:2017-08-17 18:12:29
【问题描述】:

我认为这段代码的意图很明确。我想在 X 中包含所有可能的输入词,每个数字都是列表中的一个元素。以下代码适用于 4 位数字,但对于更大的单词则不可持续。我怎样才能使它更具可扩展性?假设我想要 n 位而不是 4 位的单词。

d = [0,1]
X = [[x1,x2,x3,x4] for x1 in d for x2 in d for x3 in d for x4 in d]

【问题讨论】:

    标签: python loops scalability


    【解决方案1】:

    您可以为此使用itertools.product

    from itertools import product
    
    d = [0,1]
    x = [list(t) for t in product(d,repeat=4)]

    这给出了:

    >>> x
    [[0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [0, 0, 1, 1], [0, 1, 0, 0], [0, 1, 0, 1], [0, 1, 1, 0], [0, 1, 1, 1], [1, 0, 0, 0], [1, 0, 0, 1], [1, 0, 1, 0], [1, 0, 1, 1], [1, 1, 0, 0], [1, 1, 0, 1], [1, 1, 1, 0], [1, 1, 1, 1]]
    

    通过将repeat= 修改为例如5,您可以获得所有可能的 5 位数列表。

    如果您不需要列表 - 不应该更改元素 - 可以使用元组,在这种情况下,您可以删除 list(..) 构造:

    # list of tuples
    
    from itertools import product
    
    d = [0,1]
    x = list(product(d,repeat=4))

    这会生成:

    >>> x
    [(0, 0, 0, 0), (0, 0, 0, 1), (0, 0, 1, 0), (0, 0, 1, 1), (0, 1, 0, 0), (0, 1, 0, 1), (0, 1, 1, 0), (0, 1, 1, 1), (1, 0, 0, 0), (1, 0, 0, 1), (1, 0, 1, 0), (1, 0, 1, 1), (1, 1, 0, 0), (1, 1, 0, 1), (1, 1, 1, 0), (1, 1, 1, 1)]
    

    注意product(..) 本身是一个生成器:它懒惰地生成元素。如果结果元素的数量很大并且您可以一次处理一个,这将很有用。在这种情况下,您最好不要构建列表。例如,您可以使用:

    for tup in product(d,repeat=4):
        print(tup)

    打印所有元组。虽然效果与for tup in x: 相同,但现在内存使用可以更低(这取决于解释器中垃圾收集器的实现):因为并非所有元组都必须在内存中同时。生成器发出的下一个元组可能重用上一个元组占用的内存,因为那个地方现在是空的(至少考虑到你没有将元组存储在列表中等)

    【讨论】:

    • 发电机的东西很有趣。像[0,0,1,1] in product(d,repeat=4) 这样的东西会起作用吗?
    • @DaniMedina:我写了一个小代码片段来演示生成器的可能用法。
    猜你喜欢
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    相关资源
    最近更新 更多