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

时间:2018-06-11 18:31:14

标签: python random shuffle

我正在使用Selenium编写机器人来自动评论Instagram上的照片。我的机器人点击照片,写评论,点击下一张照片,写评论,点击下一张照片,写评论等。问题是我的机器人从我的评论列表中删除其中一条评论,但它总是使用相同的混乱评论...怎么解决?如何提高我的功能,每次点击或每个帖子后选择的评论是不同的?

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]

2 个答案:

答案 0 :(得分:1)

您可以将迭代器创建为类成员。在开始时在None初始化,如果None,请在整个列表中的iter上使用random.sample

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

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 :)

答案 1 :(得分:0)

您每次都可以使用

返回一条新语句
return random.choice(messages)

但那仍然有机会重复一线。解决方案可能是使用random.shuffle,但如果您希望对象“记住”已使用的行,则必须在__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