【问题标题】:Generate 2 Unique but random Elements in a List在列表中生成 2 个唯一但随机的元素
【发布时间】:2014-02-22 14:14:11
【问题描述】:

我需要生成一个包含唯一元素的列表

parties = ['Party A', 'Party B']

我试过了

def party_generator(size=1, chars=string.ascii_uppercase):
    parties = []
    for y in range(2):
        party = ''.join(random.choice(chars) for x in range(size))
        parties.append(''.join(['Party ', party]))
    return parties

但我担心我的代码可能会产生重复

party_generator()
['Party S', 'Party S']

如何生成包含唯一元素的列表?

【问题讨论】:

    标签: python python-3.x random


    【解决方案1】:

    使用set 跟踪您之前是否见过相同的生成随机字符串:

    def party_generator(size=1, chars=string.ascii_uppercase):
        parties = []
        seen = set()
        while len(parties) < 2:
            party = ''.join(random.choice(chars) for x in range(size))
            if party in seen:
                continue
            seen.add(party)
            parties.append('Party {}'.format(party))
        return parties
    

    这将继续生成随机字符串,直到您有 2 个唯一值。

    你不能轻易地在这里使用random.sample(),因为这需要一组固定的选择来采样来自,但是你正在生成可变长度的名称。 可以构建一个模拟序列的对象(通过给它__len____getattr__方法)并从所有可能的单词中生成一个长度为size的特定单词给定给定chars变量:

    class CharacterRange(object):
        def __init__(self, chars, size):
            self.chars, self.size = chars, size
    
        def __len__(self):
            return len(self.chars) ** self.size
    
        def __getitem__(self, item):
            if item < 0:
                item = len(self) + item
            if not 0 <= item <= len(self):
                raise IndexError('Index out of range')
    
            result = []
            for i in range(self.size):
                item, index = divmod(item, len(self.chars))
                result.append(self.chars[index])
            return ''.join(result[::-1])
    

    演示:

    >>> uppercase_len1 = CharacterRange(string.uppercase, 1)
    >>> len(uppercase_len1)
    26
    >>> uppercase_len5[0]
    'A'
    >>> uppercase_len5[-1]
    'Z'
    >>> uppercase_len1[10]
    'K'
    >>> uppercase_len1[24]
    'Y'
    >>> uppercase_len5 = CharacterRange(string.uppercase, 5)
    >>> len(uppercase_len5)
    11881376
    >>> uppercase_len5[0]
    'AAAAA'
    >>> uppercase_len5[-1]
    'ZZZZZ'
    >>> uppercase_len5[1024]
    'AABNK'
    >>> uppercase_len5[1355453]
    'CZDCV'
    

    您可以将 this 对象传递给random.sample()

    >>> import random
    >>> random.sample(uppercase_len5, 5)
    ['CUSQB', 'UUUWM', 'MKOFI', 'MYROU', 'AHRWA']
    

    在线性时间和恒定内存中生成长度为 K 的 N 个单词。

    您可以将代码简化为:

    def party_generator(size=1, chars=string.ascii_uppercase):
        return ['Party {}'.format(party) for party in random.sample(CharacterRange(chars, size))]
    

    但是,我确实认为这对于仅 2 个随机单词来说有点矫枉过正。

    【讨论】:

      猜你喜欢
      • 2013-04-22
      • 2011-07-06
      • 2012-12-29
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多