Python以函数开头:打印非部分匹配的行

时间:2018-02-08 12:57:27

标签: python windows python-2.x prefix startswith

您好我想使用startswith函数打印fileY.txt NOT fileX.txt

在下面的脚本中,我使用fileX.txtfileY.txt作为列表。然后,我使用startswith功能搜索fileX.txtfileY.txt的部分匹配。

接下来,我尝试打印fileX.txtfileY.txt之间 NOT 部分匹配的行。但是,脚本只打印fileY.txt

中的最后一行

任何帮助建议都会受到赞赏(我不介意我是否必须使用像sed这样的帮助应用程序)

来源:

#load lines from file into lists
lines1 = [line1.rstrip('\n') for line1 in open('fileX.txt')]
lines2 = [line2.rstrip('\n') for line2 in open('fileY.txt')]

#set lines
set_of_lines1 = set(lines1)
set_of_lines2 = set(lines2)

#set common
common = set_of_lines1 & set_of_lines2

#return lines which partially match as variable e
[e for e in lines1 if e.startswith(tuple(lines2))]

#minus partially matched lines from fileY.txt
difference = set_of_lines2 - e

#print the non matching lines
for color in difference:
   print 'The color prefix ' + color + ' does not exist in the list'

fileX.txt:

blue
green
red

fileY.txt:

blu
gre
re
whi
oran

我想要的是什么:

C:\Users\Foo\Bar\Python\Test\>C:\python27\python Test.py
The color prefix whi does not exist in the list
The color prefix oran does not exist in the list

Press any key to continue . . .

1 个答案:

答案 0 :(得分:1)

第一个问题是这一行:

[e for e in lines1 if e.startswith(tuple(lines2))]

它构造了部分匹配列表,然后将其抛弃。你保留的只是e的值已经从列表理解中泄露出来(在Python 3中会给你一个未定义的值错误)。你需要:

partial_match = [e for e in lines1 if e.startswith(tuple(lines2))]

它带来了第二个问题。如果您打印partial_match,您会看到它包含['blue', 'green', 'red'],我认为您希望它包含['blu', 'gre', 're'],因为您正试图在它与{{之间设置一个区别1}}。

由于您的问题围绕列表理解,我建议您将其展开到一个循环中,您可以打印出中间值,这样您就可以看到正在发生的事情并获得正确的逻辑。如果你真的想要一个单行,你可以随时重写它。

像这样:

set(['blu', 're', 'gre', 'whi', 'oran'])

matches = [] for prefix in lines2: for colour in lines1: if colour.startswith(prefix): matches.append(prefix) 现在将包含matches。现在报告不匹配的前缀。

['blu', 'gre', 're']

这将为您提供输出:

for nomatch in set(lines2) - set(matches):
    print "The color prefix %r does not exist in the list" % nomatch