python - 在列表中生成 2 个唯一但随机的元素

标签 python python-3.x random

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

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']

如何生成包含独特元素的列表?

最佳答案

使用 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 个单词有点矫枉过正。

关于python - 在列表中生成 2 个唯一但随机的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21955499/

相关文章:

python - 如何在uWSGI下调试python应用程序?

postgresql - 面对关于 x 轴和 y 轴(标签和范围)的 Bokeh 图的多个问题

java - 随机生成方程和答案

random - Erlang - 带有 Makeref 的随机数生成器

python - PyYAML 将字符串解释为时间戳

python - 参数匹配 Python

python-3.x - 新数据帧是旧数据帧中多列上 value_counts 的结果

php - 如何从php数组中检索不包括特定元素的随机元素

python - 为什么我的队伍没有 Sprite 属性?

python - OpenCV:AttributeError:模块 'cv2' 没有属性 'face'