用python中的循环更改循环变量[关闭]

问题描述 投票:0回答:3

我正在构建一个小的脚本来执行任务。我在代码的一部分中使用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)
python loops for-loop
3个回答
0
投票

不确定您要问的是什么,但是让我尝试解决您遇到的问题:)

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.

每次运行都会生成相同的“产品列表”,但顺序不同


0
投票

使用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确保没有重复,因此您不必手动检查。它没有排序,因此您不能指望该顺序保持不变。


-1
投票

您正在循环内更改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))

© www.soinside.com 2019 - 2024. All rights reserved.