比较字符串列表和字符串列表(python)

2024-04-27 14:58:15 发布

您现在位置: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的借口!

谢谢你的时间。


Tags: csv代码in文档列表fordomainitem
3条回答

你似乎在试图将旧的域名列表与新的域名列表进行比较。在建立了这些列表之后,您需要查看列表之间是否存在共性。

在这种情况下,我认为a^{}提供了更丰富的功能,使您的生活更轻松。示例:

>>> 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
>>>

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

# 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'
>>> 

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

你很可能只是错过了偏执狂。请注意,以下两行是相等的,因为in!=operator precedences是相等的:

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

你可能想要:

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

试着让它成为一个集,做和操作。

示例:

在[1]:a=['a','b','c']

在[2]:b=['b','a','c']

在[3]:集合(a)和集合(b)

出[3]:{'a','b','c'}

在[4]:集合(b)==集合(a)&集合(b)

出[4]:对

相关问题 更多 >