2013-05-08 2 views
0

У меня есть часть кода, как показано ниже, где имя файла передается в цикл итеративно. Я хочу, чтобы ни одно имя файла с тем же именем не должно обрабатываться (чтобы избежать дублирования обработки), поэтому я использовал подход «set», как указано выше.Использование set, чтобы избежать дублирования обработки

Однако это не работает должным образом. Я получаю пустой обработанный_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

Каждый раз, когда код достигнут, вы создаете 'обработанный_set'. Переместите его создание где-то вне цикла. – user4815162342

ответ

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) 

В качестве альтернативы, если createdata и create_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

0

Почему вы не строите свой набор первым, а затем обрабатываете файлы в наборе позже? набор не будет добавлять один и тот же элемент, если он уже присутствует;

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

Возможно, вам понадобится немного больше вашего кода. Не уверен, что если это так, но ваше, если условно находится в том же блоке, где вы инициализировать

processed_set = set() 

Так в основном, если хуг! = ​​1, то вы остаетесь с пустым множеством, и ничего не добавляется к набору , Если у вас установлен цикл, который несколько раз ударяет по команде else else, вы каждый раз очищаете содержимое своего набора.

Опять же, я не совсем уверен в том, как ваш код течет, так как он немного неясен на данный момент. Добавьте еще часть кода, и вам будет немного легче помочь вам.