如何总是从列表中洗牌不同的项目?

2024-10-03 21:36:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个用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]

Tags: self功能列表defselenium评论机器人what
2条回答

您可以创建一个迭代器作为类成员。开始时在None处初始化,如果None,则在整个列表上使用iter。你知道吗

调用时,返回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 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

相关问题 更多 >