[英]Changing a loop variable within the loop in python
我正在構建一個小腳本來執行任務。 我在我的代碼的一部分中使用for
循環來給我一個列表,但是,我需要列表在生成時沒有完美的順序。 為此,我嘗試在循環中反轉字符串變量“chat”,以期影響循環變量的值。
但是,我的代碼似乎沒有這樣做,因為我在運行時得到了干凈的aaa
、 aab
等輸出,無論我是否注釋掉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.998755
對0: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.