2012-02-25 28 views
2

私はここでやろうとしている何をする方法があります:オブジェクトのプロパティを反復処理して変更しますか?

for item in [self.docket_numbers, self.neutral_citations, 
      self.lower_courts, self.lower_court_judges, 
      self.dispositions, self.judges, self.nature_of_suit]: 
    if item is not None: 
     item = [clean_string(sub_item) for sub_item in item] 

明らかに、最後の行で、私はオブジェクトに戻って、リストの解釈の結果を割り当てる必要がありますが...しかし、私どうしてわからないのか

答えて

2

様々なアイテムが、それは一種の彼らがあるように見えますリスト、している場合、あなたはSETATTRを必要としない、あなたは、単にそれらを変更することができますインプレース:より

>>> def clean_string(s): 
...  return ''.join(c for c in s if c != '7') 
... 
>>> class Court(object): 
...  def __init__(self): 
...   self.docket_numbers = ["a1", "b277"] 
...   self.dispositions = ["happy", "sad77"] 
...  def clean(self): 
...   for item in [self.docket_numbers, self.dispositions]: 
...    if item is not None: 
...     item[:] = [clean_string(sub_item) for sub_item in item] 
... 
>>> C = Court() 
>>> vars(C) 
{'dispositions': ['happy', 'sad77'], 'docket_numbers': ['a1', 'b277']} 
>>> C.clean() 
>>> vars(C) 
{'dispositions': ['happy', 'sad'], 'docket_numbers': ['a1', 'b2']} 
+0

私は時々大好きです。私の現在のコードに[:]を追加するだけで、すばやく詳細で幻想的な答えをくれてありがとう。あなたはそれが何をしているのか説明できますか?私は以前それを見たことがない? – mlissner

+1

'[:]'は開始または終了が指定されていないスライスを示します。 'a_list [:]'はリストの浅いコピーを作成します。そのスライスに割り当てるときは、指定されたスライスを削除して与えられたリストに置き換えることを意味するので、 'a_list [:] = b_list'は' b_list'のすべての内容を 'a_list'に与えます。 'a_list'(これはあなたが' setattr'をそのようにする必要はありません)のものです。 –

3

名前を繰り返します。 getattrsetattrを使用できます。

for attr in ('docket_numbers', 'neutral_citations', 
      'lower_courts', 'lower_court_judges', 
      'dispositions', 'judges', 'nature_of_suit'): 
    item = getattr(self, attr) 
    if item is not None: 
     setattr(self, attr, [clean_string(sub_item) for sub_item in item]) 
+0

もう少し複雑DSMの答えですが、とにかくありがとうございます。教育的。 – mlissner

+1

@mlissnerこれはリストである項目に依存しないので、より一般的な解決策です。 – agf

関連する問題