python检查列表与另一个列表

时间:2015-02-13 15:06:26

标签: python list pattern-matching

我有两个文件:

file A:
U1
U2
U3
file B:
U1hjg 444 77 AGT
U8jha 777 33 AKS
U2jsj 772 00 AKD
U55sks 888 02 SJD
U3jsj 666 32 JSJ

然后我有两个列表:

listA=open("file A").readlines()
listB=open("file B").readlines()

我想检查列表A中每个成员是否存在于列表B中,并打印两个文件:一个文件B带有匹配项(按listA排序),另一个文件带有fileB没有匹配项。 期望的输出:

file list_match:
U1hjg 444 77 AGT
U2jsj 772 00 AKD
U3jsj 666 32 JSJ

file list_unmatched:
U8jha 777 33 AKS

U55sks 888 02 SJD

我是一个非常初学者所以我开始尝试这个例子:

print(ListA[1])
print(ListB[2])

if ListA[1] in ListB[2]:
    print("yes")

输出是:

U2
U2jsj 772 00 AKD

但是"是"没有打印

但如果我这样做:

if "U2" in ListB[2]:
    print("yes")

输出结果为:

yes

我不明白错误在哪里。有人可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

st = set(list_b)

matches  = ([line for line in list_a if line  in st])

同时获得两者:

# with will close your file automatically
with open("file A") as f1 ,open("file B")  as f2:
    st = set(f2) # get set of all lines in file b
    matches = []
    diff = []
    for line in f1: # iterate over every line in file a
        if line in st: # if line is in file b add it to our matches
            matches.append(line)
        else: # else add it to our diff list
            diff.append(line)

如果你想创建两个新文件而不是附加到列表,只需写下行。

with open("file A") as f1,open("file B") as f2,open("matches.txt","w") as mat ,open("diff.txt","w") as diff:
    st = set(f1) 
    for line in f2:
        if line in st:
            mat.write(line)
        else:
            diff.write(line)

您在自己的示例中只需要ListA[1].rstrip() in ListB[2]ListA[1]末尾有换行符,排除最后一行。 如果你print(repr(ListA[1])),你会看到确切的内容。

在我们迭代时打印我们的集合和每一行你可以在最后看到新行:

{'U2\n', 'U3', 'U1\n'} <-st
#  print(repr(line)) on all lines from fileB
'file B:\n'
'U1hjg 444 77 AGT\n'
'U8jha 777 33 AKS\n'
'U2jsj 772 00 AKD\n'
'U55sks 888 02 SJD\n'
'U3jsj 666 32 JSJ'

答案 1 :(得分:1)

这是因为readlines()为您提供了\n终止字符的行。因此,当你做

if ListA[1] in ListB[2]:
    print("yes")

你实际上是在检查"U2\n"是否在"U2jsj 772 00 AKD\n"中,返回False。但由于"U2"实际存在,因此在您使用文字时会打印"yes"

您可以在下面的示例程序中验证相同内容:

$ cat text.txt 
Sample
Text
Here.
$ cat test.py
with open("text.txt", "r") as f:
    text = f.readlines()
    print text
    print text[0]
$ python test.py
['Sample\n', 'Text\n', 'Here.\n']
Sample

$ #prompt

要更正此问题,如果您的文件很大,请使用ListA[1].rstrip()删除行。

否则,您可以使用.read()并在"\n"上拆分,创建列表,并使用自定义列表推导方法:

with open("file A") as f1 ,open("file B")  as f2:
    s1 = f1.read().split("\n")
    s2 = f2.read().split("\n")
    with open("matching.txt","w") as match, open("non-matching.txt","w") as no_match:
        matching = [x for x in s2 for y in s1 if y in x]
        non_matching = [x for x in s2 for y in s1 if y not in x]
        for line in matching:
            match.write(line)
        for line in non_matching:
            no_match.write(line)