将字符串列表与字符串列表进行比较(python)

3 投票
3 回答
15995 浏览
提问于 2025-04-17 09:40

我正在尝试比较两个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 个回答

0

试着把它变成一个集合,然后进行交集操作。

举个例子:

在第一行:a = ['a' , 'b', 'c']

在第二行:b = ['b' , 'a', 'c']

在第三行:set(a) & set(b)

输出结果:{'a', 'b', 'c'}

在第四行:set(b) == set(a) & set(b)

输出结果:True

3

你很可能只是漏掉了括号。注意下面这两行是一样的,因为 运算符的优先级 对于 in!= 是相同的:

if   item in olddomain  != item in newdomain:
if ((item in olddomain) != item) in newdomain:

你可能想要的是:

if (item in olddomain) != (item in newdomain):
8

看起来你想把一份旧的域名列表和一份新的域名列表进行比较。等这两份列表都准备好后,你想看看它们之间有没有共同的内容。

在这种情况下,我觉得使用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()时,一般遵循以下规则:

  • 如果元素的顺序很重要(比如需要通过索引来访问它们),就用list()
  • 在其他情况下,就用set()

编辑

既然你在问我之前发的代码为什么会报TypeError错误,如果你是按照我那样给row赋值的话,你需要用row[0]而不是row[0:]

>>> row = ['example.com', '', 'excomment', 'Parked Page']
>>> row[0:]
['example.com', '', 'excomment', 'Parked Page']
>>> row[0]
'example.com'
>>> 

我把我的例子改成这样,因为我怀疑问题就出在这里。

撰写回答