在3个独立的场合迭代(A-Z + 0-9)的最佳方法是什么? 例如AAA,AAB..AA0,AA1..ZZ0,ZZ1 ......一直到999.数字或字符是否出现在任一插槽中没有限制。
chars = [string.ascii_uppercase + string.digits]
genned_chars = []
for char in list(itertools.product(''.join(char), repeat=3)):
genned_chars.append(''.join(char))
我从哪里去?
编辑:
while True:
chars = string.ascii_uppercase + string.digits
genned_chars = [''.join(i) for i in itertools .product(chars,repeat=3)]
genned_chars = ['']
session = requests.session()
session.headers = { 'User-Agent': 'Mozilla/5.0 (iPad; CPU OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53' }
page = session.get('URL' + str(genned_chars))
if page.status_code == '302':
continue
else:
with open("validurls.txt","a") as f:
f.write( 'URL' + str(genned_chars) + '\n')
答案 0 :(得分:3)
您不需要将字符串放在列表中,也不要将list
用于生成器,并使用列表推导来加入产品:
>>> import string
>>> chars = string.ascii_uppercase + string.digits
>>> genned_chars=[''.join(i) for i in itertools .product(chars,repeat=3)]
答案 1 :(得分:1)
你可以在没有itertools
的情况下通过你的chars字符串进行三次传递来完成。我不确定性能虽然(编辑:我已经证实这比我的机器上的 15ms 更慢 - 比上面的@ Kasra的itertools列表理解解决方案)但是你通过寻找更清楚你在做什么在代码。
import string
chars = string.ascii_uppercase + string.digits
genned_chars = []
for a in chars:
for b in chars:
for c in chars:
genned_chars.append('{0}{1}{2}'.format(a, b, c))
编辑2:但是,使用列表推导实现上述速度比使用itertools更快:
import string
chars = string.ascii_uppercase + string.digits
genned_chars = [a+b+c for a in chars for b in chars for c in chars]
答案 2 :(得分:0)
不相关但可能有用,具体取决于你在做什么。
假设您想通过索引选择一个数字并直接转到该字符串。
>>> import string
>>> chars = string.ascii_uppercase + string.digits
>>> len_chars = len(chars)
>>> N = 3
>>> i = 0
>>> ''.join([chars[(i // len_chars**j)%len_chars] for j in range(N-1,-1,-1)])
'AAA'
>>> i = 569
>>> ''.join([chars[(i // len_chars**j)%len_chars] for j in range(N-1,-1,-1)])
'AP3'
如果您要创建一个URL缩短器,这可能很有用。你记得你正在做什么索引,将它递增1,然后返回那个新组合。