谁还没个明天 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 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败