2011-04-18 84 views
0

說我有這段代碼,我想在兩個單獨的字典上執行它。如何在不編寫代碼兩次的情況下輕鬆完成此操作?我想我可以定義一個小函數,然後將每個字典傳遞給它。有沒有更好的方法?同時在兩個單獨的字典上執行代碼塊

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 

回答

4

你可以這樣做:

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 

不過,我覺得寫一個小功能可能更清晰。

+0

+1你快了10秒;-) – 2011-04-18 18:23:34

1

請其使用字典作爲參數

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

寫入其作爲函數f然後map(f, [self.mfiles.iteritems, self.nmfiles.iteritems])的方法。

0

如果你知道self.mfilesself.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 
1

我會使用代碼分解出到另一功能的組合和運行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]) 
+0

在Python 3中,map產生一個迭代器而不是一個列表。因此,您將無法使用地圖來獲得像這樣的副作用。 – 2011-04-18 20:44:48