我正在编写一个小型的API监听程序,而我正试图弄清楚什么时候发布了新内容。我已经弄明白了大部分内容,但我在最后一步遇到了问题 - 我想打印出新的东西。我可以将两个项目列表作为集合进行比较,并获得正确答案中的字母集,但我似乎无法获得要打印的实际字符串。
这里是我编写的用于比较两个列表的代码(new_revised_stuff
和old_revised_stuff
都是字符串列表,例如"Bob likes to eat breakfast at http://bobsburgers.com"
,每个列表有几十个项目)。
new_stuff = set(new_revised_stuff) - set(old_revised_stuff).intersection(new_revised_stuff)
返回:
set('b','o','l'...)
我可以摆脱'设置'写作符号:
list(new_stuff)
但这并没有真正帮助。我真的很喜欢打印出来" Bob喜欢......"如果那是一条新线。
我也尝试过:
new_stuff = []
for a in new_revised_stuff:
for b in old_revised_stuff:
if a != b:
''.join(a)
new_stuff.append(a)
这会导致实际的堆栈溢出,因此代码显然很糟糕。
答案 0 :(得分:1)
如果要将任何可迭代的单个字符加入字符串,请使用''.join(new_stuff)
执行此操作。例如:
>>> new_stuff = ['b','o','l']
>>> ''.join(new_stuff)
'bol'
但是,这里存在两个问题,这些问题是您设计中固有的:
"Hello, Bob"
,那么差异的集中只会有一个o
和一个l
。"Bob likes"
,将其转换为集合然后再转换为字符串将获得类似'k iboeBls'
的内容。如果其中任何一个是问题(我怀疑它们是),您需要重新考虑您的算法。您可以使用OrderedSet
来解决第二个问题(collections
文档中有一个配方),但第一个问题将会出现问题。
那么如何你这样做?
嗯,你真的不需要new_revised_stuff
成为一个集合;如果你遍历字符并只保留那些不在old_revised_stuff
中的字符,只要old_revised_stuff
是一个集合,那就像交叉两个集合一样有效。
但是制作old_revised_stuff
一套也会消除那里的任何重复,我认为你不想要。你真正想要的是一个“multiset”。在Python中,表示它的最佳方式通常是Counter
。
所以,我认为你想要的(也许)是这样的:
old_string = ' to eat breakfast at http://bobsburgers.com'
new_string = 'Bob likes to eat breakfast at http://bobsburgers.com'
old_chars = collections.Counter(old_string)
new_chars = []
for ch in new_string:
if old_chars[ch]:
old_chars[ch] -= 1
else:
new_chars.append(ch)
new_string = ''.join(new_chars)