谁还没个明天 2010-02-13 12:23 采纳率: 50%
浏览 1160
已采纳

在 Python 中使用大写字母和数字随机生成字符串

I want to generate a string of size N.

It should be made up of numbers and uppercase English letters such as:

  • 6U1S75
  • 4Z4UKK
  • U911K4

How can I achieve this in a pythonic way?

转载于:https://stackoverflow.com/questions/2257441/random-string-generation-with-upper-case-letters-and-digits-in-python

  • 写回答

25条回答 默认 最新

  • Memor.の 2010-02-13 12:26
    关注

    Answer in one line:

    ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N))
    

    or even shorter starting with Python 3.6 using random.choices():

    ''.join(random.choices(string.ascii_uppercase + string.digits, k=N))
    

    A cryptographically more secure version; see https://stackoverflow.com/a/23728630/2213647:

    ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(N))
    

    In details, with a clean function for further reuse:

    >>> import string
    >>> import random
    >>> def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
    ...    return ''.join(random.choice(chars) for _ in range(size))
    ...
    >>> id_generator()
    'G5G74W'
    >>> id_generator(3, "6793YUIO")
    'Y3U'
    

    How does it work ?

    We import string, a module that contains sequences of common ASCII characters, and random, a module that deals with random generation.

    string.ascii_uppercase + string.digits just concatenates the list of characters representing uppercase ASCII chars and digits:

    >>> string.ascii_uppercase
    'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    >>> string.digits
    '0123456789'
    >>> string.ascii_uppercase + string.digits
    'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
    

    Then we use a list comprehension to create a list of 'n' elements:

    >>> range(4) # range create a list of 'n' numbers
    [0, 1, 2, 3]
    >>> ['elem' for _ in range(4)] # we use range to create 4 times 'elem'
    ['elem', 'elem', 'elem', 'elem']
    

    In the example above, we use [ to create the list, but we don't in the id_generator function so Python doesn't create the list in memory, but generates the elements on the fly, one by one (more about this here).

    Instead of asking to create 'n' times the string elem, we will ask Python to create 'n' times a random character, picked from a sequence of characters:

    >>> random.choice("abcde")
    'a'
    >>> random.choice("abcde")
    'd'
    >>> random.choice("abcde")
    'b'
    

    Therefore random.choice(chars) for _ in range(size) really is creating a sequence of size characters. Characters that are randomly picked from chars:

    >>> [random.choice('abcde') for _ in range(3)]
    ['a', 'b', 'b']
    >>> [random.choice('abcde') for _ in range(3)]
    ['e', 'b', 'e']
    >>> [random.choice('abcde') for _ in range(3)]
    ['d', 'a', 'c']
    

    Then we just join them with an empty string so the sequence becomes a string:

    >>> ''.join(['a', 'b', 'b'])
    'abb'
    >>> [random.choice('abcde') for _ in range(3)]
    ['d', 'c', 'b']
    >>> ''.join(random.choice('abcde') for _ in range(3))
    'dac'
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(24条)

报告相同问题?

悬赏问题

  • ¥15 安装svn网络有问题怎么办
  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥15 latex怎么处理论文引理引用参考文献