迭代Python中的Arraylist用于字母数字

时间:2015-01-10 12:18:29

标签: python

在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')

3 个答案:

答案 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,然后返回那个新组合。