Python iterables列表上的迭代类型转换

Python iterables列表上的迭代类型转换,python,iterator,list-comprehension,itertools,Python,Iterator,List Comprehension,Itertools,我有这样一个字符串列表: names = ['Katia', 'Alexandre'] 我想实现这个结果: ['Katia', 'Alexandre', 'Katia Alexandre', 'Alexandre Katia'] i、 我需要大小范围(1,长度(名称)+1)的所有排列 我编写了这个函数,它生成一个iterables列表: import itertools def permutations_all_sizes(iterable): sizes = range(1, l

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

names = ['Katia', 'Alexandre']
我想实现这个结果:

['Katia', 'Alexandre', 'Katia Alexandre', 'Alexandre Katia']
i、 我需要大小范围(1,长度(名称)+1)的所有排列

我编写了这个函数,它生成一个iterables列表:

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')]]

有人能解释这种行为的原因吗?

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

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

对代码行为的解释:

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

大小=范围(1,len(iterable)+1)=范围(1,3)
,所以

permutations=[itertools.permutations(iterable,x)用于x的大小]=

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

itertools.置换(iterable,1)
包含iterable元素长度为1的元组:

names = ['Katia', 'Alexandre']
for something in itertools.permutations(names, 1):
    print(something)  # will print ('Katia',) then ('Alexandre',)
因此,对这个排列对象执行
list(tup)
将给出一个元组列表,如
[('Catia',),('Alexandre',)]

相同的逻辑适用于
itertools。置换(iterable,2)

list(tup)
将给出
[('Katia','Alexandre'),('Alexandre','Katia')]

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


将列表理解修改为
[iterator for iterator in perms]
中的tup列表(tup)没有任何作用:
perms
已经是一个列表,
[iterator for iterator in perms]
相当于
perms

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

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

对代码行为的解释:

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

大小=范围(1,len(iterable)+1)=范围(1,3)
,所以

permutations=[itertools.permutations(iterable,x)用于x的大小]=

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

itertools.置换(iterable,1)
包含iterable元素长度为1的元组:

names = ['Katia', 'Alexandre']
for something in itertools.permutations(names, 1):
    print(something)  # will print ('Katia',) then ('Alexandre',)
因此,对这个排列对象执行
list(tup)
将给出一个元组列表,如
[('Catia',),('Alexandre',)]

相同的逻辑适用于
itertools。置换(iterable,2)

list(tup)
将给出
[('Katia','Alexandre'),('Alexandre','Katia')]

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


将列表理解修改为
[在[iterator for iterator in perms]]中的tup列表(tup)]
没有任何作用:
perms
已经是一个列表,
[iterator for iterator in perms]
相当于
perms

您可以使用
''。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

您可以使用
'.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