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

Chr*_*ong 1 python string list

我正在尝试将两个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
Run Code Online (Sandbox Code Playgroud)

列表的输出看起来像(第二列通常是空白的):

['example.com', '', 'excomment', 'Parked Page']
Run Code Online (Sandbox Code Playgroud)

在尝试比较列表时,我尝试过类似的方法:

if item in olddomain != item in newdomain:
                    print "no match"
                else:
                    print "match"
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用,例如,两个文件中的第一行包含完全相同的数据,但代码返回"不匹配",两个文件中的第二行也包含相同的数据,但代码返回"比赛"

问题是我将行保存到列表中的方式,还是我还缺少其他东西?我将假设有一种更好的方法可以做到这一点,但我用它作为学习更多python的借口!

谢谢你的时间.

Mik*_*ton 7

您似乎正在尝试将旧的域名列表与新的域名列表进行比较.在构建这些列表之后,您希望查看列表之间是否存在共性.

在这种情况下,我认为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
>>>
Run Code Online (Sandbox Code Playgroud)

重写部分代码以使用集合将如下所示:

# 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
Run Code Online (Sandbox Code Playgroud)

你问的代码:

if olddomain.intersection(newdomain) == set([]):
                    print "no match"
                else:
                    print "match"
Run Code Online (Sandbox Code Playgroud)

我在确定是否使用a set()或a 时使用的一般规则list():

  • 如果保持元素的排序很重要(包括能够使用索引访问它们),请使用a list()
  • 在任何其他情况下,使用a set()

编辑

既然你问为什么我发布的代码会抛出一个TypeError,如果你的分配row方式与我相同,那么你需要使用row[0]而不是row[0:]

>>> row = ['example.com', '', 'excomment', 'Parked Page']
>>> row[0:]
['example.com', '', 'excomment', 'Parked Page']
>>> row[0]
'example.com'
>>> 
Run Code Online (Sandbox Code Playgroud)

我改变了我的例子以反映这一点,因为我怀疑这就是问题所在.