比较两组字符串,然后返回Python 3.4中不同的整个字符串

时间:2014-10-17 21:55:37

标签: python python-3.x set

我正在编写一个小型的API监听程序,而我正试图弄清楚什么时候发布了新内容。我已经弄明白了大部分内容,但我在最后一步遇到了问题 - 我想打印出新的东西。我可以将两个项目列表作为集合进行比较,并获得正确答案中的字母集,但我似乎无法获得要打印的实际字符串。

这里是我编写的用于比较两个列表的代码(new_revised_stuffold_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)

这会导致实际的堆栈溢出,因此代码显然很糟糕。

1 个答案:

答案 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)