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]
这样做的好处是保持 A
在 a_filtered
中的顺序(没有要删除的元素)...
我有一个逗号分隔的文本文件,其内容有点像这样:
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]
这样做的好处是保持 A
在 a_filtered
中的顺序(没有要删除的元素)...