繁体   English   中英

在 python 中的循环中更改循环变量

[英]Changing a loop variable within the loop in python

我正在构建一个小脚本来执行任务。 我在我的代码的一部分中使用for循环来给我一个列表,但是,我需要列表在生成时没有完美的顺序。 为此,我尝试在循环中反转字符串变量“chat”,以期影响循环变量的值。

但是,我的代码似乎没有这样做,因为我在运行时得到了干净的aaaaab等输出,无论我是否注释掉char = 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.

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

具有随机输出的超快“产品”列表生成器!

我花了一些时间并得到了工作示例

import itertools
from contextlib import contextmanager
from random import shuffle, sample
from datetime import datetime

char = "abcdefgf"


def generate_product(char):
    items = []
    for i, item in enumerate(itertools.product(char, repeat=len(char))):
        items.append("".join(item))
    shuffle(items)

    return items


def generate(char):
    pools = (char,) * len(char)

    result = ['']
    for i, pool in enumerate(pools):
        # let's shuffle the pool, it will randomize output without extra performance hit
        pool_rnd = sample(pool, k=len(pool))

        result = [x + y for x in result for y in pool_rnd]

    return result


@contextmanager
def timeit(name):
    start = datetime.now()
    print('Started "{}" at {}. Please wait ...'.format(name, start))

    yield

    end = datetime.now()
    print('Finished "{}" at {}! Execution took {}'.format(name, start, end - start))


with timeit('generate_product'):
    items1 = generate_product(char)
    # # print('\n'.join(items1))
    print(' > Contains {} charecters.'.format(len(items1)))

with timeit('generate'):
    items2 = generate(char)
    # print('\n'.join(items2))
    print(' > Contains {} charecters.'.format(len(items2)))

print('Are equal? Sorted comparision result={}'.format(sorted(items1) == sorted(items2)))

比较速度!

#> python test123.py

Started "generate_product" at 2019-12-13 05:35:39.219348. Please wait ...
 > Contains 16777216 charecters.
Finished "generate_product" at 2019-12-13 05:35:39.219348! Execution took 0:00:30.075320
Started "generate" at 2019-12-13 05:36:09.294871. Please wait ...
 > Contains 16777216 charecters.
Finished "generate" at 2019-12-13 05:36:09.294871! Execution took 0:00:02.998755
Are equal? Sorted comparision result=True

只是0:00:02.9987550:00:30.075320 这是我相信的胜利!

算法的另一项“压力测试”!

在 2019-12-13 05:39:01.434788 开始“生成”。 请稍候... 包含 387420489 个字符。 在 2019-12-13 05:39:01.434788 完成“生成”! 执行时间为 0:01:20.306413

80 秒生成 387_420_489 个组合列表! 我消耗了 25 GB 或 RAM :D

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM