簡體   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