2012-05-11 13 views
4

をアイテムを交換してください:は、私はこのような文字列のリストを持って、リスト内のpython

Item_has_was_updated_May_2010 
Item_updated_Apr_2011 
Item_got_updated_Sept_2011 

私は、文字列のリストを反復処理し、文字列の最後の2部を更新したいです。月と年残りの文字列は同じままにします。月と年はスクリプトで前に設定した変数から取られますので、月xと年yを呼び出してみましょう。 「_」

  • は、最後の2つの項目が
  • 置き換えると一緒に戻ってアイテムを参加置き換えによって文字列のリスト
  • スプリット各文字列によって

    1. 反復:

      私のアプローチがにあります項目

    私のスクリプトで前に設定した変数から月と年が取られるので、今月xa年と年。

    誰かがアプローチを提案できれば、それは分かります。

  • +1

    を?合理的と思われるプロセスの概要を説明しました。実装してみましたか? – Jesse

    +0

    Pythonで不変のものをリストします。変更することはできません。
    ただし、新しいリストにコピーして変更することができます。 –

    +2

    リストは変更可能です。しかし、文字列は不変です。 –

    答えて

    9

    あなたはstr.rsplitを使って正規表現せずにそれを行うことができます。

    yourlist = [s.rsplit('_', 2)[0] + '_' + x + '_' + y for s in yourlist] 
    

    それがオンラインで作業を参照してください:ideone


    あなたの代わりに文字列の連結のフォーマットを使用したい場合は、この試してみてください。

    yourlist = ['{}_{}_{}'.format(s.rsplit('_', 2)[0], x, y) for s in yourlist] 
    

    オンラインでの作業参照:ideone

    +3

    「_」もできます。(s.split( '_')[: - 2] + [x、y]) ' –

    +0

    @NiklasB .: +1うまくいきます。それはやや簡潔です。 'rsplit'を使用するのと比べて、不必要な分割と結合を行います。しかし、おそらく例の文字列のサイズを考えると大きな問題ではありません。 –

    +0

    私はそれが文字列連結(新しい文字列を4回作成する必要がある)より高速かもしれないと思います。 'format'アプローチはもちろん大丈夫です: –

    2

    私は本当に「再」必要はないと思う。
    あなたはこのようなものを使用できます:あなたは正確に何を求めている

    m="dec" 
    y=2012 
    l=["Item_has_was_updated_May_2010", 
        "Item_updated_Apr_2011", 
        "Item_got_updated_Sept_2011"] 
    r=[] 
    for s in l: 
        t=s.split("_") 
        r.append("_".join(t[:-2])+"_%s_%s"%(m,y)) 
    
    +1

    ' r = []; l:r.append(...) 'のパターンは、リスト内包表記が有効なものです。 –

    2
    lst = [ 
        'Item_has_was_updated_May_2010', 
        'Item_updated_Apr_2011', 
        'Item_got_updated_Sept_2011', 
    ] 
    month='Sep';year='2012' 
    for s in lst: 
         list=s.split('_') 
         list[-2:]=(month,year) 
         r='' 
         for a in list: 
           r=r+"%s_"%a 
         r=r[:-1] 
         print r 
    
    関連する問題