我在文件中有一行字符串,我想将这些行相互比较,只打印差异。 例如,这两行:
4fe6c343554c51454e503249393954564837304d4c323330513254524e49500a
4fe6c470554c51454e503249393954564837304d4c323330513254524e49500a
我只想在这里打印奇数:
c343
c470
提前完成
答案 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