Python 中的列表减法

List Subtraction in Python

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

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 从 emails1.csv 中减去 emails2.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 的两倍——这是设计使然。不过我也是菜鸟,不知道自己看的对不对。

使用 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']

您可以使用集合:

difference = set(listA) - set(listB)

不同于其他人使用的 all set 方法,您可以将 B 设为 set 并从 A 中过滤掉它的内容:

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

这样做的好处是保持 Aa_filtered 中的顺序(没有要删除的元素)...