在Python中列出减法

时间:2015-02-19 04:52:42

标签: python list set logic

我有一个逗号分隔的文本文件,其内容有点像这样:

pickle_4500@dill.chile, pickle_4501@dill.chile, pickle_4502@dill.chile, pickle_4503@dill.chile, pickle_4504@dill.chile, pickle_4505@dill.chile

我们称之为emails1.csv。我也有另一个以逗号分隔的文本文件:

pickle_4503@dill.chile, pickle_4505@dill.chile

我们称之为emails2.csv。我需要使用Python从emails2.csv中减去emails1.csv。在伪代码中:

emails1.csv = emails1.csv - emails2.csv

Python的总处女,但我根据我发现的几个例子做了这个。它做了我认为的吗?也就是说,从emails2.csv中取出emails1.csv中的电子邮件,并将差异放在名为subtractomatic.csv的文件中。

from sets import Set
import csv

fin = open('emails1.csv', 'rb')
reader = csv.reader(fin)
email_list1 = list(reader)[0]

fin = open('emails2.csv', 'rb')
reader = csv.reader(fin)
email_list2 = list(reader)[0]

email_list1 = list(set(email_list1)-set(email_list2))

fout = open('subtractomatic.csv', 'wb')
writer = csv.writer(fout, quoting=csv.QUOTE_NONE)
writer.writerow(email_list1)

fout.close()

fin.close()
fin.close()

我认为这样做是因为我的原始文件emails1.csv中包含X封电子邮件,当我打开subtractomatic.csv时,其中有电子邮件,当我运行时

grep @ -o subtractomatic.csv | wc -l

在终端中我得到X/2,这是有道理的,因为emails1.csv的电子邮件数量是emails2.csv的两倍---按设计。然而,我也是一个新手,所以我不知道我正在看这件事。

3 个答案:

答案 0 :(得分:2)

使用sets查找两个列表之间的差异,然后将结果分配回列表1. sets模块提供用于构造和操作唯一元素的无序集合的类。常见用途包括成员资格测试,从序列中删除重复项,以及计算集合上的标准数学运算,例如交集,并集,差异和对称差异。

>>> l1 = ['pickle_4500@dill.chile', 'pickle_4501@dill.chile', 'pickle_4502@dill.chile', 'pickle_4503@dill.chile', 'pickle_4504@dill.chile', 'pickle_4505@dill.chile']
>>> l2 = ['pickle_4503@dill.chile', 'pickle_4505@dill.chile']
>>> set(l1)-set(l2)
{'pickle_4500@dill.chile', 'pickle_4502@dill.chile', 'pickle_4504@dill.chile', 'pickle_4501@dill.chile'}
>>> list(set(l1)-set(l2))
['pickle_4500@dill.chile', 'pickle_4502@dill.chile', 'pickle_4504@dill.chile', 'pickle_4501@dill.chile']
>>> l1 = list(set(l1)-set(l2))
>>> l1
['pickle_4500@dill.chile', 'pickle_4502@dill.chile', 'pickle_4504@dill.chile', 'pickle_4501@dill.chile']

答案 1 :(得分:2)

您可以使用套装:

difference = set(listA) - set(listB)

答案 2 :(得分:0)

您可以将B设为set并从A过滤掉其内容,而不是其他人使用的所有设置方法:

b_set = set(B)
a_filtered = [a for a in A if a not in b_set]

这样做的好处是可以在A中保持a_filtered的顺序(没有您要删除的元素)......