2016-12-14 47 views
0

我創建了一個函數,它將解析目錄中的文件並將值保存在列表中。然後我在三個不同的目錄上運行該功能。一旦我這樣做,然後我想比較列表,看看它們是否相等。但是,即使在每個目錄中複製並粘貼相同文件時,執行此操作的函數也始終返回False。以下是我正在使用的兩個功能。從目錄解析後比較兩個列表

ParseFiles功能

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) 

比較解析

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

測試解析

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

'對於L1中的val:if val in L2:return False'。因此,如果您列出兩個列表並且它們有一個共同的項目,那麼函數應該返回'False'? – roganjosh

+0

所以你的函數返回'None'或者是1-item列表。那是故意的嗎? –

+0

如果列表不匹配,我希望它返回False。否則爲真。如果是真的,我不想對它做任何事情。如果它是假的,我會做其他事情。 – NineTail

回答

1

因爲y我們的第一個檢查是列表的長度是相同的,您在此處比較列表d可以避免此問題。

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

我想我在使用你的例子進行調試時發現了這個問題。出於某種原因,ParseFile函數僅返回目錄中的第一個已解析文件,而沒有存儲其餘的文件。我不知道爲什麼會發生這種情況。 – NineTail