1

「2010 年 10 月 28 日」(または類似) の形式で指定された日付があります。ここで、月の完全な名前を短いバージョン (この場合は Oct) に変更したいと考えています。このために、私は辞書を用意しました:

_mapping = {'January': 'Jan', 
            'February': 'Feb', 
            'March': 'Mar', 
            'April': 'Apr', 
            'May': 'May', 
            'June': 'Jun', 
            'July': 'Jul', 
            'August': 'Aug', 
            'September': 'Sep', 
            'October': 'Oct', 
            'November': 'Nov', 
            'December': 'Dec'}

そして、置換が行われる方法で、私は次のように書きました:

def fetch(self, pno):
    ...
    date = #get data (working fine)
    for l, s in self._mapping.iteritems():
        pubdate = date.replace(l, s)
        print l + " -> " + pubdate #this is only for debug
    (pubd_month, self.pubd_day, self.pubd_year) = pubdate.split(' ')
    print pubd_month, self.pubd_day, self.pubd_year
    print pubdate

実行結果は次のとおりです。

February -> October 28, 2008
October -> Oct 28, 2008
January -> October 28, 2008
April -> October 28, 2008
November -> October 28, 2008
March -> October 28, 2008
August -> October 28, 2008
May -> October 28, 2008
December -> October 28, 2008
June -> October 28, 2008
September -> October 28, 2008
July -> October 28, 2008
October
October 28, 2008

ご覧のとおり、October が見つかった場合は置換がうまくいくように見えますが、ループの外では完全な月の名前が再び取得されます。私は何を間違っていますか?

別の質問: これを行うためのより短い方法はありますか?

4

2 に答える 2

3

で常に置換pubdateを行っているためdate、成功した一致はすべて上書きされます。

置換する前に月が文字列に含まれているかどうかを最初にテストするか、結果に置き換えます。pubdatepubdate.replace()

pubdate = #get data (working fine)
for l, s in self._mapping.iteritems():
    pubdate = pubdate.replace(l, s)

または、テストを使用して:

date = #get data (working fine)
for l, s in self._mapping.iteritems():
    if l in date:
        pubdate = date.replace(l, s)

後者はpubdate、複数の月名が見つかった場合でも上書きされます。または、 1か月の試合しかない場合はbreak、ループを早期に終了するために使用します。

date = #get data (working fine)
for l, s in self._mapping.iteritems():
    if l in date:
        pubdate = date.replace(l, s)
        break

警告:一致するものが見つからない場合は、pubdate割り当てられることはなく、UnboundLocal例外が発生します。

于 2013-09-21T13:06:01.893 に答える