我正在构建一个小的脚本来执行任务。我在代码的一部分中使用for
循环来提供列表,但是,在生成列表时,我需要列表的顺序不正确。为此,我尝试在循环中反转字符串变量“ chat”,并将其反馈给itertools.product()
变量。
但是,我的代码似乎没有执行此操作,因为启动时我得到了清晰的aaa aab输出并注释了char[::-1]
我要用for循环做些什么吗?或还有其他方法吗?
[此外,我使用列表来确保没有重复,我在最后打印char以确保它已更改,除非它似乎没有循环。
这里是代码。
import time
import itertools
char = "abc"
counter = 0
x = []
for i in itertools.product(char, repeat=3):
if ''.join(i)in x:
break
print(''.join(i))
counter += 1
char = char[::-1]
x.append(''.join(i))
print('[+] Printed ' + str(counter)+ ' charecters.')
print(char)
不确定您要问的是什么,但是让我尝试解决您遇到的问题:)
import itertools
from random import shuffle
char = "abc"
items = [''.join(x) for x in itertools.product(char, repeat=len(char))]
shuffle(items)
print('\n'.join(items))
print('[+] Printed {} charecters.'.format(len(items)))
python test123.py
bbb
aca
bcb
abb
aab
bcc
acb
cca
abc
ccc
cac
caa
ccb
bca
cbb
bba
aba
aac
baa
bab
bac
cbc
bbc
acc
aaa
cab
cba
[+] Printed 27 charecters.
每次运行都会生成相同的“产品列表”,但顺序不同
使用itertools.product
混乱地创建列表的问题是itertools.product
是生成器。该函数接受字符串输入,并一次给您提供字母的每种组合(将字符串像列表一样处理)。有时这很好,因为它可以节省内存。不幸的是,它只是按顺序进行。您可以将函数返回的内容转换为列表,然后使用random.shuffle
函数对列表进行加扰并从此处构建加扰的列表。
import itertools
import random
char="outlet"
#Here we call the itertools.product function with the reverse of the char variable
myList = itertools.product(char[::-1],repeat=3)#list is sorted here
random.shuffle(myList)#scramble it
myList = [''.join(x) for x in myList]
print(myList)
#myList is no longer sorted
更新:您的代码在每次迭代中都反转字符,因此对于奇数次迭代,您将拥有一个反向字符,而对于偶数,您将拥有一个正向字符。 itertools.product
是只运行一次的发电机。无法从循环内部到达它。我不确定要对生成器的输出进行处理,还是与char有什么关系,但是我认为这并不是真正适合您所执行操作的工具。另外,如果要确保列表中每个实例只有一个,并且顺序无关紧要,则set()
是适合您的类型,而不是list()
。 Set确保没有重复,因此您不必手动检查。它没有排序,因此您不能指望该顺序保持不变。
您正在循环内更改char
,该循环遍历product(char, repeat=3)
。
尽管char
每次都会更改(您可以通过打印来进行检查),但这不会影响正在循环的数据。如果您考虑一下,那是有道理的:您期望会发生什么?
循环简单地完成了对原始产品的迭代,并且每个值都会按顺序显示,反转char
则无济于事。
如果您试图显示原始字符串中所有三个字符的字符组合,但是以随机顺序显示,则可以:
import random
import itertools
chars = 'abc'
result = list(itertools.product(chars, repeat=3))
random.shuffle(result)
for x in result:
print(''.join(x))