如何始终从列表中随机播放不同的项目?

How to always shuffle different item from list?

我正在使用 Selenium 编写机器人来自动评论 Instagram 上的照片。我的机器人点击照片,写评论,点击下一张照片,写评论,点击下一张照片,写评论,等等。问题是我的机器人从我的评论列表中随机播放其中一条评论,但它总是使用相同的随机评论......如何解决?关于每次点击后或每次 post 选择的评论都不一样,如何改进我的功能?

def randomComments(self):
    messages = [
        'Nice cat',
        'What a lovely cat',
        'Wow, great picture',
        'Amaizing, I am in love <3',
        'Beautiful',
        'I have same cat :)'
    ]

    r = random.randint(0, len(messages))

    return messages[r]

您可以创建一个迭代器作为 class 成员。开始时在 None 处初始化,如果 None,则在整个列表的 random.sample 上使用 iter

调用时,return next 元素。在 StopIteration 异常(当您到达列表末尾时正常),创建另一个包装在新 iterable 中的随机洗牌列表:

import random

class Foo:
    messages = [
        'Nice cat',
        'What a lovely cat',
        'Wow, great picture',
        'Amaizing, I am in love <3',
        'Beautiful',
        'I have same cat :)'
    ]
    def __init__(self):
        self.__msgiter = None
    def randomComments(self):
        if self.__msgiter:
            try:
                return next(self.__msgiter)
            except StopIteration:
                pass

        self.__msgiter = iter(random.sample(self.messages,len(self.messages)))
        return next(self.__msgiter)

f = Foo()
for _ in range(10):
    print(f.randomComments())

一个输出:

What a lovely cat
Wow, great picture
I have same cat :)
Amaizing, I am in love <3
Nice cat
Beautiful
Nice cat
What a lovely cat
Beautiful
I have same cat :)

你每次都可以return一个新的声明

return random.choice(messages)

但这仍然有机会重复台词。解决方案可能是使用 random.shuffle,但是如果您希望对象 "remember" 已经使用了哪些行,则必须在 __init__ 阶段执行此操作:

def __init__(self):
    # add to whatever code you already have here
    self.messages = [
        'Nice cat',
        'What a lovely cat',
        'Wow, great picture',
        'Amaizing, I am in love <3',
        'Beautiful',
        'I have same cat :)'
    ]
    random.shuffle(self.messages)

def randomComments(self):
    return self.messages.pop()

然而,一个小警告,如果您已经完成 运行 一次列表,这将失败,如果您需要无限地继续这样做,请考虑以其他方式添加该功能,可能使用 itertools