2016-12-14 3 views
0

Ich habe eine Funktion erstellt, die Dateien in einem Verzeichnis analysiert und die Werte in einer Liste speichert. Ich führe dann die Funktion auf drei verschiedenen Verzeichnissen aus. Sobald ich das tue, möchte ich dann die Listen vergleichen, um zu sehen, ob sie gleich sind. Die Funktion führt jedoch immer False zurück, auch wenn ich dieselben Dateien in jedem Verzeichnis kopiere und einfüge. Unten sind die zwei Funktionen, mit denen ich arbeite.Vergleichen von zwei Listen nach dem Parse von einem Verzeichnis

ParseFiles Funktion:

def ParseFiles(path): 
    for filename in os.listdir(path): 
     # check filename to ensure it ends in appropriate file extension 
     if filename.endswith(('.cfg', '.startup', 'confg')): 
      # concatinate os path and filename 
      file_name = os.path.join(path, filename) 
      with open(file_name, "r") as in_file: 
       for line in in_file: 
        # match everything after hostname 
        match = re.search('^hostname\s(\S+)$', line) 
        #store match in a list for use later 
        if match: 
         hostname = [match.group(1)] 
         return hostname 
         #print (hostname) 

Vergleichen Parse:

def ParseCompare(L1, L2): 
    if len(L1) != len(L2): 
     return False 
    for val in L1: 
     if val in L2: 
      return False 
    return True 

Testing Parse:

archiveParse = ParseFiles(TEST_PATH) 
startupParse = ParseFiles(TEST_PATH_1) 
runningParse = ParseFiles(TEST_PATH_2) 

print ParseCompare(startupParse, archiveParse) 

if ParseCompare(startupParse, archiveParse) == False: 
    print("Startup does not match Archive") 
if ParseCompare(startupParse, runningParse) == False: 
    print("Startup and Running do not match") 
if ParseCompare(runningParse, archiveParse) == False: 
    print("Running does not match Archive") 
else: 
    print("Compared OK") 
+1

'für val in L1: wenn val in L2: zurück False'. Also, wenn Sie zwei Listen präsentieren und sie ein Element gemeinsam haben, sollte die Funktion 'False' zurückgeben? – roganjosh

+0

, so dass Ihre Funktion "None" oder eine 1-Item-Liste zurückgibt. Ist das beabsichtigt? –

+0

Ich möchte, dass es False zurückgibt, wenn die Listen nicht übereinstimmen. Wahr sonst. Wenn es wahr ist, will ich nichts damit anfangen. Wenn es falsch ist, werde ich andere Dinge tun. – NineTail

Antwort

1

Da y unsere erste Überprüfung ist, dass die Listen die gleiche Länge haben, vermeiden Sie das Problem mit Vergleichen der Liste d hier.

a = [1, 2, 3] 
b = [3, 2, 1] 
c = [4, 2, 3] 
d = [3, 3, 2, 1] 

# Long version 
def compare(L1, L2): 
    """ 
    Create a list of booleans for every item, and only return True 
    if *all* items in L1 are in L2 
    """ 
    print("comparison lists are {} and {}".format(L1, L2)) 
    print("Boolean list is {}".format([item in L1 for item in L2])) 

    if all(item in L1 for item in L2): 
     print('Equal lists') 
     return True 

    print ('Not equal') 
    return False 

call1 = compare(a, b) 
print "Bool value is: {}".format(call1) 
print "..............." 

call2 = compare(c, a) 
print "Bool value is: {}".format(call2) 
print "..............." 

call3 = compare(a, d) 
print "Bool value is: {}".format(call3) 
print "..............." 


# Short function 
def compare(L1, L2): 
    return all(item in L1 for item in L2) 
+0

Ich denke, ich habe das Problem beim Debuggen mit Ihrem Beispiel gefunden. Die ParseFile-Funktion gibt aus irgendeinem Grund nur die erste analysierte Datei im Verzeichnis zurück und speichert den Rest nicht. Ich bin mir nicht sicher, warum das passiert. – NineTail

Verwandte Themen