Python字符串之间的差异

时间:2014-12-18 10:58:55

标签: python string

我在文件中有一行字符串,我想将这些行相互比较,只打印差异。 例如,这两行:

4fe6c343554c51454e503249393954564837304d4c323330513254524e49500a
4fe6c470554c51454e503249393954564837304d4c323330513254524e49500a

我只想在这里打印奇数:

c343
c470

提前完成

4 个答案:

答案 0 :(得分:1)

如果你想要区别差异只是数字,你可以使用zip函数将字符串压缩在一起,然后你可以将它们一起比较:

>>> [''.join(i) for i in zip(*[(i,j) for i,j in zip(s1,s2) if i!=j])]
['343', '470']

答案 1 :(得分:1)

假设您正在寻找一个愚蠢的差异(仅基于位置),Kasra's answer适合您的示例只有两个字符串。

但是,你说你有很多字符串。有许多不同的方法可以将它扩展到多个字符串;根据我的理解,你希望每个职位都算作"赔率的一部分"在所有字符串中,如果列表中任何位置的任何字符串对在该位置不同。

这几乎是同一个问题:你拉上字符串,遍历每个字符串中一个字符的元组,然后解压缩结果。但是如果你有一个N个字符的元组,而不仅仅是i!=j,你如何检查是否有任何一对?转过来:如果每个对是相同的,那么它们都是相同的,所以如果你把它们放在一个集合中,那么这个集合将有一个元素。

所以:

>>> strings = '''4fe6c343554c51454e503249393954564837304d4c323330513254524e49500a
... 4fe6c470554c51454e503249393954564837304d4c323330513254524e49500a
... 4fe60470554c51454e503249393954564837304d4c323330513254524e49500a'''.splitlines()
>>> [''.join(i) for i in zip(*(chars for chars in zip(*strings) 
...                            if len(set(chars)) != 1))]
['c343', 'c470', '0470']

如果您在文件中获得了这些字符串,只需传递文件:

>>> with open('strings.txt') as f:
...    odds = [''.join(i) for i in zip(*(chars for chars in zip(*f) 
...                                    if len(set(chars)) != 1))]
>>> odds
['c343', 'c470', '0470']

答案 2 :(得分:1)

>>> from itertools import compress
>>> strings = ['4fe6c343554c51454e503249393954564837304d4c323330513254524e49500a', '4fe6c470554c51454e503249393954564837304d4c323330513254524e49500a']
>>> diff = map(str.__ne__, *strings)
>>> [''.join(compress(s, diff)) for s in strings]
['343', '470']

对于任意数量的字符串

>>> strings = ['4fe6c343554c51454e503249393954564837304d4c323330513254524e49500a', '4fe6c470554c51454e503249393954564837304d4c323330513254524e49500a', '4fe60470554c51454e503249393954564837304d4c323330513254524e49500a']
>>> diff = [len(set(chars)) != 1 for chars in zip(*strings)]
>>> [''.join(compress(s, diff)) for s in strings]
['c343', 'c470', '0470']

答案 3 :(得分:0)

a = r'4fe6c343554c51454e503249393954564837304d4c323330513254524e49500a'
b = r'4fe6c470554c51454e503249393954564837304d4c323330513254524e49500a'

print ''.join((v for k,v in enumerate(a) if b[k] != v)) #343
print ''.join((v for k,v in enumerate(b) if a[k] != v)) #470