【问题标题】:Iterative type conversion over list of iterables可迭代列表的迭代类型转换
【发布时间】:2026-02-13 21:30:01
【问题描述】:

我有这样一个字符串列表:

names = ['Katia', 'Alexandre']

我想达到这个结果:

['Katia', 'Alexandre', 'Katia Alexandre', 'Alexandre Katia']

i.e. 我需要大小 range(1, length(names)+1) 的所有排列。

我编写了这个函数来生成一个可迭代的列表:

import itertools

def permutations_all_sizes(iterable):
    sizes = range(1, len(iterable)+1)
    permutations = [itertools.permutations(iterable, x) for x in sizes]

    return permutations

现在,我的想法是执行一个嵌套列表推导来解开字符串。但是,无论我是嵌套还是不嵌套,结果总是一样的:

perms = permutations_all_sizes(names)

[list(tup) for tup in perms]
[162]: [[('Catia',), ('Alexandre',)], [('Catia', 'Alexandre'), ('Alexandre', 'Catia')]]

[list(tup) for tup in [iterator for iterator in perms]]
[165]: [[('Catia',), ('Alexandre',)], [('Catia', 'Alexandre'), ('Alexandre', 'Catia')]]

有人可以解释为什么会出现这种行为吗?

【问题讨论】:

    标签: python iterator list-comprehension itertools


    【解决方案1】:

    您可以使用' '.join 方法将字符串元组连接成以空格分隔的字符串:

    def permutations_all_sizes(iterable):
        sizes = range(1, len(iterable)+1)
        permutations = [' '.join(permutation) for x in sizes for permutation in itertools.permutations(iterable, x)]
        return permutations
    

    【讨论】:

      【解决方案2】:

      您可以通过以下列表理解获得所需的输出:

      print([' '.join(names) for tup in perms for names in tup])
      

      代码行为说明:

      names = ['Katia', 'Alexandre'],所以

      sizes = range(1, len(iterable)+1) = range(1, 3),所以

      permutations = [itertools.permutations(iterable, x) for x in sizes] =

      = [itertools.permutations(iterable, 1), itertools.permutations(iterable, 2).

      itertools.permutations(iterable, 1) 包含长度为 1 的可迭代元素的元组:

      names = ['Katia', 'Alexandre']
      for something in itertools.permutations(names, 1):
          print(something)  # will print ('Katia',) then ('Alexandre',)
      

      这样做list(tup) 这个排列对象将给出一个像[('Catia',), ('Alexandre',)] 这样的元组列表。

      同样的逻辑适用于itertools.permutations(iterable, 2)

      names = ['Katia', 'Alexandre']
      for something in itertools.permutations(names, 2):
          print(something)  # will print ('Katia', 'Alexandre'), then ('Alexandre', 'Katia')
      

      list(tup) 将提供[('Katia', 'Alexandre'), ('Alexandre', 'Katia')]

      将它们组合到列表理解中[list(tup) for tup in perms] 将得到您得到的输出:[[('Catia',), ('Alexandre',)], [('Catia', 'Alexandre'), ('Alexandre', 'Catia')]]

      将列表解析修改为 [list(tup) for tup in [iterator for iterator in perms]] 没有任何作用:perms 已经是一个列表,[iterator for iterator in perms] 等效于 perms

      【讨论】: