выполнить блок кода на двух отдельных диктовках одновременно - PullRequest
0 голосов
/ 18 апреля 2011

Скажем, у меня есть этот кусок кода, и я хочу выполнить его в двух отдельных словарях.Как я могу сделать это легко без написания кода дважды?Я думаю, я мог бы определить небольшую функцию, а затем передать ей каждый дикт.Есть ли лучшие способы?

    for key, value in self.mfiles.iteritems():
        if key not in self.INPUT['extras']:
            self.mfiles[key] = self.dirs['confdir'] + '/' + value

    for key, value in self.nmfiles.iteritems():
        if key not in self.INPUT['extras']:
            self.nmfiles[key] = self.dirs['confdir'] + '/' + value

Ответы [ 5 ]

4 голосов
/ 18 апреля 2011

Вы можете сделать это:

for data in (self.mfiles, self.nmfiles):
    for key, value in data.iteritems():
        if key not in self.INPUT['extras']:
            data[key] = self.dirs['confdir'] + '/' + value

Тем не менее, я думаю, что написание небольшой функции, вероятно, яснее.

1 голос
/ 18 апреля 2011

Я бы использовал комбинацию выделения кода для другой функции и запуска map (которая выполняет функцию для всех элементов в итерируемой) для всех словарей, которые вы хотите преобразовать:

def doSomething(self, dic):
    for key, value in dic.iteritems():
        if key not in self.INPUT['extras']:
            dic[key] = self.dirs['confdir'] + '/' + value

def runMe(self):
       map(doSomething, [self.mfiles, self.nmfiles])
1 голос
/ 18 апреля 2011

Создайте метод, который использует словарь в качестве параметра

class MyClass:
    def doit(self, dictionary):
        for key, value in dictionary.iteritems():
        if key not in self.INPUT['extras']:
            dictionary[key] = self.dirs['confdir'] + '/' + value
    def run(self):
        self.doit(self.mfiles)
        self.doit(self.nmfiles)
0 голосов
/ 18 апреля 2011

Если вы знаете, что self.mfiles и self.nmfiles не используют одни и те же ключи, тогда вы можете выполнить «слияние» и выполнить итерацию по этому.

for key, value in dict(self.mfiles, **self.nmfiles).iteritems():
    # do stuff

В противном случае итерируйте по отдельности:

for d in (self.mfiles, self.nmfiles):
    for key, value in d.iteritems():
        # do stuff
0 голосов
/ 18 апреля 2011

Запишите его как функцию f, а затем map(f, [self.mfiles.iteritems, self.nmfiles.iteritems]).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...