2016-06-14 53 views
0

我有動物名稱的列表:檢查一些元素缺失,有些則不是蟒蛇

aList = [animal_lionAnimal, 
animal_elephantAnimal_1, 
animal_elephantAnimal_2, 
animal_elephantAnimal_3, 
animal_pandaAnimal_1, 
animal_pandaAnimal_2] 

然後,我有一個文件,它也包含了這些動物的名字。我通過argumentparser讀取文件,然後使用正則表達式來查找這些動物(更具體地說是re.finall)。

for aFile in args.filePath: 
    contents = open(aFile).read() 

# An example of what the regex tries find in the file: (*animal_elephantAnimal_1()) = 0.0; # some comments 
aRegex = re.findall(r'(?:.\s+\(\*)(animal\w+)(?:.[^;]*)', contents) 

我想要做的是「驗證」,看看來自aList的動物是否在文件中。這裏是一些假設:

  1. 如果發現從ALIST所有動物那麼其確定

  2. 如果從ALIST所有動物都缺少那麼其還OK

  3. 如果從ALIST一些動物失蹤有些不是(例如獅子存在,但不是熊貓和大象),那麼它不行,應該給一個sys.exit或別的東西。

這裏是我的發言至今:

#Remove matching animals 
listHaveElement = list(set(aList) - set(aRegex)) 

if not listHaveElement: #if list is [] 
    print "There are no animals name missing ", listHaveElement 
else: #if there are animals missing 
    print sys.exit("There are animals missing and they are: {0}".format(listHaveElement)) 

一些示例:

animal_lionAnimalAsdf, -> Missing due to wrong name 

animal_elephantAnimal_1, -> not missing 

animal_elephantAnimal_2, -> not missing 

animal_elephantAnimal_3, -> not missing 

animal_pandaAnimal_1Mooo, -> missing due to wrong name 

animal_pandaAnimal_2 -> not missing 

不知道如何解決第三個發言。

回答

0

在一般情況下,你可以通過下面的檢查列表A的所有元素都包含列表B內:

all(a in B for a in A) 

這將返回True如果A每個元素是內B或者A是空的。如果A中缺少任何單個元素,它將返回False。因此,您可以使用:

if all(animal in aRegex for animal in aList): 
    print "There are no animals name missing ", aList 
else: 
    listHaveElement = list(set(aList) - set(aRegex)) 
    print sys.exit("There are animals missing and they are: {0}".format(listHaveElement)) 
+0

嗯。但是,如果它們都丟失/拼寫錯誤,那麼它不應該「崩潰」,因爲它是可以的。因爲所有的動物名字都在那裏,或者沒有。它不可能是一半,有一半不是。但是感覺像解決方案不可行,因爲我正在比較列表和文件? – gants

+0

@gants如果'aRegex'和'aList'都是列表(根據你的問題,它們應該是),那麼這種方法將起作用。如果情況並非如此,請修改您的問題以澄清每個變量的含義 – wnnmaw