将字符串列表与字符串列表进行比较(python)
我正在尝试比较两个Excel文档,它们大约有6000行和4列,第一列是域名,其他三列是评论。其中一个文档在某些列中更新了评论,最终我希望这个脚本能像批量更新一样,把新的评论替换掉旧的过时评论。
到目前为止,我写的代码打开了这两个文档,并把它们添加到两个不同的列表中:
import csv
newlist = csv.reader(open('newcomments.csv','rU'), dialect='excel')
export = csv.reader(open('oldcomments.csv', 'rU'), dialect='excel')
for row in newlist:
olddomain=[]
domain = row[0:]
olddomain.append(domain)
for item in olddomain:
print item
for row in export:
newdomain=[]
domain= row[0:]
newdomain.append(domain)
for item in newdomain:
print item
从列表输出的内容看起来是这样的(第二列通常是空的):
['example.com', '', 'excomment', 'Parked Page']
在尝试比较这两个列表时,我试过类似这样的代码:
if item in olddomain != item in newdomain:
print "no match"
else:
print "match"
但这似乎不太管用,比如说,两个文件的第一行包含完全相同的数据,但代码却返回“没有匹配”,而两个文件的第二行也包含相同的数据,但代码却返回“匹配”。
问题是我保存行到列表的方式不对,还是我遗漏了什么其他的东西?我想这可能有更好的方法来做这件事,但我用这个作为借口来学习更多的Python!
谢谢你的时间。
3 个回答
试着把它变成一个集合,然后进行交集操作。
举个例子:
在第一行:a = ['a' , 'b', 'c']
在第二行:b = ['b' , 'a', 'c']
在第三行:set(a) & set(b)
输出结果:{'a', 'b', 'c'}
在第四行:set(b) == set(a) & set(b)
输出结果:True
你很可能只是漏掉了括号。注意下面这两行是一样的,因为 运算符的优先级 对于 in
和 !=
是相同的:
if item in olddomain != item in newdomain:
if ((item in olddomain) != item) in newdomain:
你可能想要的是:
if (item in olddomain) != (item in newdomain):
看起来你想把一份旧的域名列表和一份新的域名列表进行比较。等这两份列表都准备好后,你想看看它们之间有没有共同的内容。
在这种情况下,我觉得使用set()
会让你的工作变得更简单,因为它提供了很多实用的功能。举个例子:
>>> olddomains = set(['www.cisco.com', 'www.juniper.com', 'www.hp.com'])
>>> newdomains = set(['www.microsoft.com', 'www.cisco.com', 'www.apple.com'])
>>> olddomains.intersection(newdomains)
set(['www.cisco.com'])
>>>
>>> 'www.google.com' in newdomains
False
>>>
把你代码的一部分改成使用集合(set)会像这样:
# retain newlist, since that's the output from csv...
for row in newlist:
olddomain = set([])
domain = row[0]
olddomain.add(domain.lower()) # use lower() to ensure no CAPS mess things up
for item in olddomain:
print item
还有你问到的那段代码:
if olddomain.intersection(newdomain) == set([]):
print "no match"
else:
print "match"
我在决定使用set()
还是list()
时,一般遵循以下规则:
编辑
既然你在问我之前发的代码为什么会报TypeError
错误,如果你是按照我那样给row
赋值的话,你需要用row[0]
而不是row[0:]
>>> row = ['example.com', '', 'excomment', 'Parked Page']
>>> row[0:]
['example.com', '', 'excomment', 'Parked Page']
>>> row[0]
'example.com'
>>>
我把我的例子改成这样,因为我怀疑问题就出在这里。