python -> combinations of numbers and letters

前端 未结 4 795
醉话见心
醉话见心 2020-12-18 17:36
#!/usr/bin/python
import random
lower_a = [\'a\', \'b\', \'c\', \'d\', \'e\', \'f\', \'g\', \'h\', \'i\', \'j\', \'k\', \'l\', \'m\', \'n\', \'o\', \'p\', \'q\', \'r         


        
相关标签:
4条回答
  • 2020-12-18 17:40

    The pythonic way ;)

    Print all combinations:

    
    from itertools import combinations
    
    symbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
              "abcdefghijklmnopqrstuvwxyz"
              "0123456789"
    max_length = len(symbols)
    
    for length in xrange(1, max_length + 1):
        for word in map(''.join, combinations(symbols, length)):
            print word
    

    Even better, create an generator object which yields the combinations, so that one can decide later what to do with them without having to store 2 ** 62 strings (7.6040173890593902e+35 bytes) in memory.

    
    from itertools import combinations, product
    
    symbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
              "abcdefghijklmnopqrstuvwxyz"
              "0123456789"
    max_length = len(symbols)
    
    # generator of all combinations
    def words1(chars=symbols, max_len=max_length):
        for length in xrange(1, max_length + 1):
            for word in map(''.join, combinations(symbols, length)):
                yield word
    
    # generator of all combinations allowing repetitions
    def words1(chars=symbols, max_len=max_length):
        for length in xrange(1, max_length + 1):
            for word in map(''.join, product(*[symbols]*length)):
                yield word
    
    
    for word in words1():
        #do something with word
        print word
    

    Both combinations and product, as well as many other functions, return iterators instead of lists in order to save memory:

    
    >>> print combinations('0123456789',2)
    <itertools.combinations object at 0x13e34b0>
    >>> print list(combinations('0123456789',2))
    [('0', '1'), ('0', '2'), ('0', '3'), ('0', '4'), ('0', '5'), ('0', '6'), ('0', '7'), ('0', '8'), ('0', '9'), ('1', '2'), ('1', '3'), ('1', '4'), ('1', '5'), ('1', '6'), ('1', '7'), ('1', '8'), ('1', '9'), ('2', '3'), ('2', '4'), ('2', '5'), ('2', '6'), ('2', '7'), ('2', '8'), ('2', '9'), ('3', '4'), ('3', '5'), ('3', '6'), ('3', '7'), ('3', '8'), ('3', '9'), ('4', '5'), ('4', '6'), ('4', '7'), ('4', '8'), ('4', '9'), ('5', '6'), ('5', '7'), ('5', '8'), ('5', '9'), ('6', '7'), ('6', '8'), ('6', '9'), ('7', '8'), ('7', '9'), ('8', '9')]
    

    0 讨论(0)
  • 2020-12-18 17:49

    Take a look at function combinations in the module itertools (http://docs.python.org/library/itertools.html#itertools.combinations)

    import itertools
    ... setup all ...
    for ilen in range(1, len(all)):
      for combo in itertools.combinations(all, ilen):
        print combo
    
    0 讨论(0)
  • 2020-12-18 17:51

    I haven't tested this, but I think the basic idea should hold. Please comment if it doesn't work and I'll debug it:

    L = ['ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz', '0123456789']
    def f(L, length, s=''):
        print s
        if len(s) == length:
            print s
        else:
            for word in L:
                for char in word:
                    w = word.replace(char, '')
                    l = L[:]
                    l.remove(word)
                    l.append(w)
                    f(l, length, s+char)
    
    0 讨论(0)
  • 2020-12-18 18:01

    It's best not to recreate functionality that is already in the standard library.

    Take a look at the standard library module itertools. Particularly the combinations(), permutations(), and product() functions.

    import itertools
    
    lower_a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
    upper_a = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
    num = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
    
    all = lower_a + upper_a + num
    
    for r in range(1, 3):
        for s in itertools.product(all, repeat=r):
             print ''.join(s)
    

    If your version of Python is old you may not have access to these functions. However if you take a look in the documentation for Python 2.6, you can see how all of these functions can be implemented in Python. For instance, the implementation of itertools.product is given as:

    def product(*args, **kwds):
        # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
        # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
        pools = map(tuple, args) * kwds.get('repeat', 1)
        result = [[]]
        for pool in pools:
            result = [x+[y] for x in result for y in pool]
        for prod in result:
            yield tuple(prod)
    

    You could also try a recursive solution instead:

    lower_a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
    upper_a = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
    num = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
    
    all = lower_a + upper_a + num
    
    def recursive_product(myList, length, myString = ""):
        if length == 0:
            print myString
            return
        for c in myList:
            recursive_product(myList, length-1, myString + c)
        
    for r in range(1, 3):
        recursive_product(all, r)
    
    0 讨论(0)
提交回复
热议问题