如何始终从列表中随机播放不同的项目?
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
我正在使用 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