我正在尝试编写一些代码来比较两个列表,其中每个列表都包含电子邮件地址。但是,逐行比较不是一个选项,因为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
中吗。
非常感谢
如果你只是想看看其中一个是否在另一个中(而不关心频率等),你可以尝试使用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