【问题标题】:List Subtraction in PythonPython中的列表减法
【发布时间】:2015-02-19 04:52:42
【问题描述】:

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

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 的两倍---按设计。不过我也是新手,所以不知道我看这个东西对不对。

【问题讨论】:

  • 您可以执行以下操作:list_a = list(set(list_a) - set(list_b))
  • 要清楚,上面的“=”是一个重新赋值运算符。
  • 嗨 PicklePilot,欢迎来到 StackOverflow!我已为您的问题添加了正确的代码格式,并删除了一些与您的问题无关的额外文本。请查看我们的常见问题解答。如果您能明确说明您期望的结果,您将得到符合您期望的答案。
  • "psuedocodenese" 是 Pickle_Pilot 于 2015 年 2 月 18 日星期三 20:50:27 PST 创造的,如果我愿意的话,它可能正在美国专利商标局注册。 ^_^

标签: python list set logic


【解决方案1】:

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

【讨论】:

  • 我要对你完全诚实,Avinash Raj,我检查了你的,因为我喜欢你的头像...^_^
  • 其实我收回了,我检查了你的,因为我喜欢你的小头像。我以为它是一个绿色的武士独眼巨人,有三个向上的牙齿,但是当我点击它时,它更大了,它并不那么有趣。不知道我为什么要告诉你这个。
【解决方案2】:

你可以使用集合:

difference = set(listA) - set(listB)

【讨论】:

  • ...如果您希望之后保持列表的排序顺序,您可以使用sorted
【解决方案3】:

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

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

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

【讨论】:

  • 你的意思是if a not in b_set?此外,为什么要将B 更改为一个集合?你可以使用B,它是一个列表,对吗?
猜你喜欢
  • 2014-08-11
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
  • 2018-11-28
相关资源
最近更新 更多