我正在使用Python的PRAW函数制作redditbot。漫游器本身会检查subreddit中的帖子是否在标题中包含特定单词,如果是,则将其交叉发布到另一个subreddit。但是,一旦发生这种情况,该过程将重复进行以创建重复的交叉帖子,我尝试通过标题比较来抵消这种情况,以便它可以过滤出已经存在的帖子。
我正在尝试比较两个单独的reddit提交的字符串。因此,如果两个提交的标题都匹配,请不要发布,如果不匹配,请发布。
下面的代码在另一个for循环中,该循环检查另一个subreddit的内容,该代码可以正常工作,下面的for循环给我带来了麻烦。
变量名例如realtitle和realtitle1存储第一个for循环的提交标题的原始标题。
不好的代码和变量命名方案的道歉。
import praw
from PyDictionary import PyDictionary
import enchant
from twisted.internet import task, reactor
timeout = 1800.0;
def FunctionName():
reddit = praw.Reddit(senstiveredditinfohere)
subreddit = reddit.subreddit("sub1");
source = reddit.subreddit("sub2");
for submission in source.new(limit=50):
realsubmission = submission;
title = submission.title.lower();
realtitle = submission.title;
realrealtitle = realtitle + " (by X)"
title1 = submission.title + " (by X)";
for submission1 in subreddit.new(limit=200):
if submission1.title == realrealtitle:
continue;
elif submission1.title != realrealtitle:
if "string1" in title:
realsubmission.crosspost(subreddit, title=realtitle + " (by X)");
title="";
realtitle = "";
continue;
elif "string2" in title:
realsubmission.crosspost(subreddit, title=realtitle + " (by X)");
title="";
realtitle = "";
continue;
elif "string3" in title:
realsubmission.crosspost(subreddit, title=realtitle + " (by X)");
title="";
realtitle = "";
continue;
elif "string4" in title:
realsubmission.crosspost(subreddit, title=realtitle + " (by X)");
title="";
realtitle = "";
continue;
elif "string5" in title:
realsubmission.crosspost(subreddit, title=realtitle + " (by X)");
title="";
realtitle = "";
continue;
else:
break;
else:
break;
FunctionName()
l = task.LoopingCall(FunctionName)
l.start(timeout)
reactor.run()
答案 0 :(得分:0)
在您的 if 语句中,如果标题不匹配,则会中断for循环。改为使用continue语句。
if submission1.title == realrealtitle:
continue; # try the next submission in subreddit.new(limit=200)
如果标题匹配,您想尝试下一个。
最后一个 break 还有另外两件事无法解决,并且您将 submission.title 的较低版本存储在 title 中,请确保“字符串1”,“字符串2”等也较低。
答案 1 :(得分:0)
我认为您的两个嵌套循环的逻辑从根本上是错误的。目前它是这样的:
for x in first_iterable:
for y in second_iterable:
if x != y:
do_something(x)
以几个range
作为迭代变量来尝试一下,我想您会发现它没有按照您的意愿做。 do_something(x)
和x
值每次不匹配时都会发生y
调用,每次x
可能会多次。
对于您的用例,您只希望每个x
运行一次,并且仅在与y
不匹配的情况下运行。为此,您可能想要的代码更像这样:
for x in first_iterable:
if x not in second_iterable:
do_something(x)
编写not in
测试的另一种方法是使用all(x != y for y in second_iterable)
(这比简单的不等式更方便于更复杂的测试)。此代码将在运行second_iterable
之前检查do_something(x)
中的所有值,而不是在存在许多不匹配对的情况下重复检查。
将其用您当前的代码表示(将与标题相关的冗余变量缩减为一个,并为其命名一个更好的名称):
for submission in source.new(limit=50):
crosspost_title = submission.title + " (by X)"
if all(crosspost_title != other.title for other in subreddit.new(limit=200)):
...
请注意,如果您在检查帖子是否已经交叉张贴之前,先进行关键字(例如"string1"
)的检查,这可能会提高代码的效率。我建议使用any
进行该测试,而不要使用一大堆if
且其中包含相同代码(if any(keyword in title for keyword in ["string1", "string2", ...]):
)的测试。