Python - 比较两个电子邮件列表,其中存在电子邮件但不同的行

时间:2012-12-09 17:54:34

标签: python list python-2.7 compare

我正在尝试编写一些代码来比较两个列表,其中每个列表都包含电子邮件地址。但是,逐行比较不是一个选项,因为list1中的同一封电子邮件可以存在于list2中,但位于不同的行号中。

我正在使用这种方法:

F1 = open("c:\\FILEA.txt", "r").read().split('\n')
F2 = open("c:\\FILEB.txt", "r").read().split('\n')

lines1 = filter(None, (line.rstrip() for line in sorted([n.lower() for n in F1])))
lines2 = filter(None, (line.rstrip() for line in sorted([n.lower() for n in F2])))


for i in ( i for i in lines1 if lines2[:2] == lines1[:2]):
    print i
    break

以上只是一个例子,但只是逐行比较。 有没有人知道如何比较list1中的每封电子邮件,并查看list2中是否存在该电子邮件。

非常感谢

1 个答案:

答案 0 :(得分:4)

如果您只想查看一方是否在另一方(并且不关心频率等),您可以尝试使用set来存储每个文件中出现的唯一事件,然后找到两个集合中的intersection,这将表示两个文件中都存在的电子邮件(请注意,带有两个文件的with语句是Python2.7 +功能):

>>> l1 = set()
>>> l2 = set()
>>> with open('FILEA.txt', 'rb') as f1, open('FILEB.txt', 'rb') as f2:
...     for line in f1.readlines():
...         l1.add(line.strip())
...     for line in f2.readlines():
...         l2.add(line.strip())
... 
>>> 
>>> l1
set(['another@gmail.com', 'andanother@hotmail.com', 'this@email.com'])
>>> l2
set(['unique@somehost.com', 'this@email.com', 'not@example.com'])
>>> l1 & l2
set(['this@email.com'])

使用集合,您还可以执行其他(可能)有用的操作:

识别两个集合中的项目(联合):

>>> l1 | l2
set(['another@gmail.com', 'unique@somehost.com', 'andanother@hotmail.com', 'this@email.com', 'not@example.com'])

一组中但不属于另一组的项目(差异):

>>> l1 - l2
set(['another@gmail.com', 'andanother@hotmail.com'])
>>> l2 - l1
set(['not@example.com', 'unique@somehost.com'])

每个集合唯一的项目(将其视为联合而不是交集)(symmetric_difference):

>>> l1 ^ l2
set(['another@gmail.com', 'not@example.com', 'unique@somehost.com', 'andanother@hotmail.com'])

最后,您还可以使用方法而不是运算符来执行这些操作。要使用这些方法,请使用一个集合,在上面的括号中附加其中一个名称,并将另一个名称设置为参数:

>>> l1.intersection(l2)
set(['this@email.com'])

我的文件看起来像这样:

<强> FILEA.txt

this@email.com
another@gmail.com
andanother@hotmail.com

<强> FILEB.txt

not@example.com
this@email.com
unique@somehost.com