2013-05-08 56 views
0

我有一個像下面的代碼中的一部分,其中文件名被迭代地提供給循環。我希望沒有兩個具有相同名稱的文件名應該被處理(爲了避免重複處理),所以我使用瞭如上所述的「set」方法。使用設置,以避免重複處理

但是,這似乎沒有按預期工作。我得到一個空的processed_set和邏輯沒有按預期執行。

else: 
    create_folder(filename) 
    processed_set=set() 

    if xyz ==1: 
     if filename not in processed_set: 
      createdata(name) 
      processed_set.add(filename) 
     else: 
      avoid_double_process(name) 
+7

您每次到達代碼時都會創建'processed_set'。將其創建移到循環之外的某處。 – user4815162342 2013-05-08 06:42:56

回答

1

從我可以從代碼示例推斷和猜測基於函數名稱,你想要做的是避免運行代碼,如果filename已被處理。你會做這種方式:

processed_set = set() #initialize set outside of loop 
for filename in filenames: #loop over some collection of filenames 
    if filename not in processed_set: #check for non-membership 
     processed_set.add(filename) #add to set since filename wasn't in the set 
     create_folder(filename) #repositioned based on implied semantics of the name 
     createdata(filename) 

另外,如果createdatacreate_folder你不想爲同一個文件名多次運行這兩個功能,你可以創建一個過濾裝飾。如果你真正關心的返回值,你可能需要使用一個memoizing裝飾

def run_once(f): 
    f.processed = set() 
    def wrapper(filename): 
     if filename not in f.processed: 
     f.processed.add(filename) 
     f(filename) 
    return wrapper 

則包括@run_once就行了你的函數定義之前,你只需要運行一次的功能。

+0

謝謝。是的,我想避免重複處理的努力,如果文件已經處理過一次。第一個代碼就是訣竅。由於一些限制,我不能使用第二種方法。 – user741592 2013-05-08 09:34:25

0

爲什麼不先建立你的設置,然後再處理設置中的文件?如果它已經存在,該集合將不會添加相同的元素;

>>> myset = { element for element in ['abc', 'def', 'ghi', 'def'] } 
>>> myset 
set(['abc', 'ghi', 'def']) 
0

有點多的代碼可能會有幫助。不知道如果是這樣的話,但是你如果條件是在同一個塊中,你初始化

processed_set = set() 

所以基本上如果XYZ!= 1,那麼你留下一個空集和沒有被添加到組。如果您設置了多次觸發第一個else語句的循環,則您每次都清除設置的內容。

再一次,我不太確定你的代碼是如何流動的,因爲目前它有點模糊。添加更多的周邊代碼,讓人們更容易幫助你。