-4

文字列を置き換えたい非常に長いリストがあります。私の問題を説明するために、以下に簡単な例を作成しました。

my_list = ['a7_1_1', 'a7_2_1', 'a7_3_1','a7_1_2', 'a7_2_2', 'a7_3_2','a7_1_3', 'a7_2_3', 'a7_3_3']


Out[12]:
['a7_1_1',
 'a7_2_1',
 'a7_3_1',
 'a7_1_2',
 'a7_2_2',
 'a7_3_2',
 'a7_1_3',
 'a7_2_3',
 'a7_3_3'

文字列を最初の 3 つの文字列に追加されたサフィックスに置き換えたいので、最終的なリストは次のようになります。

my_new_list = ['a7_1_1', 'a7_2_1', 'a7_3_1','a7_1_1.1', 'a7_2_1.1', 'a7_3_1.1','a7_1_1.2', 'a7_2_1.2', 'a7_3_1.2']


Out[15]:
['a7_1_1',
 'a7_2_1',
 'a7_3_1',
 'a7_1_1.1',
 'a7_2_1.1',
 'a7_3_1.1',
 'a7_1_1.2',
 'a7_2_1.2',
 'a7_3_1.2']

これを行う簡単な方法はありますか?

4

2 に答える 2

2

itertools.cycle() 関数の使用

import itertools as it           #1

def cycle_first_n(lst, n):
    """ cycles through first n elements of the list """
    c = it.cycle(lst[:n])        #2
    for idx in xrange(len(lst)): #3
        sfx = idx / n
        yield c.next() + ('.' + str(sfx) if sfx > 0 else '')  #4
  1. itertools は効率的なループのための反復子を作成するためのライブラリです
  2. リストの n 要素のスライスを循環する反復子を作成します
  3. range ではなく xrange を使用して、メモリ内におそらく長いリストを作成しないようにします (質問を参照してください)。
  4. yield は、ジェネレーターを作成していることを意味します。繰り返しますが、メモリ内に長いリストが作成されるのを避けるために

機能の使い方

lst = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
for o in cycle_first_n(lst, 3):
    print o,

出力

a b c a.1 b.1 c.1 a.2 b.2
于 2013-09-10T06:13:54.323 に答える
0

私はあなたが何を意味するのかよくわかりません。これを行うかどうかを確認します。

>>> my_list = ['a7_1_1', 'a7_2_1', 'a7_3_1','a7_1_2', 'a7_2_2', 'a7_3_2','a7_1_3', 'a7_2_3', 'a7_3_3']
>>> my_new_list = sum([[x, x+'.1', x+'.2'] for x in my_list[:3]], [])
>>> print(my_new_list)
['a7_1_1', 'a7_1_1.1', 'a7_1_1.2', 'a7_2_1', 'a7_2_1.1', 'a7_2_1.2', 'a7_3_1', 'a7_3_1.1', 'a7_3_1.2']
于 2013-09-10T05:37:47.503 に答える