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