1

文字列のリストがあり、いくつかのアイテムを組み合わせる必要がありました。組み合わされる各アイテムは、次のように連続した順序でリストされます。

info = [u'1', u'be/4', u'root', u'0.00', u'B', u'0.00', u'B', u'0.00', u'%', u'0.00', u'%', u'init']

info[3] = info[3] + info[4]

info.pop(4)

info[4] = info[4] + info[5]

info.pop(5)

info[5] = info[5] + info[6]

info.pop(6)

info[6] = info[6] + info[7]

info.pop(7)

>>> info
[u'1', u'be/4', u'root', u'0.00B', u'0.00B', u'0.00%', u'0.00%', u'init']

最後の行は望ましい出力ですが、すべてのポップと割り当てなしでより良い方法のアイデアを得たいと思いましたか?

更新:うわー!これらはすべて素晴らしいです。すべてをテストして時間を計りたいです ;)

4

4 に答える 4

2

考えられる解決策の 1 つ

>>> info[:3] + [''.join(e) for e in zip(info[3::2],info[4::2])] + info[-1:]
[u'1', u'be/4', u'root', u'0.00B', u'0.00B', u'0.00%', u'0.00%', u'init']
于 2012-12-13T18:36:52.537 に答える
2

アイテムのシーケンスを処理していて、新しいシーケンスを作成したい場合、この種の問題を解決する良い方法は、ジェネレーター関数を使用することです。これはうまくいくと思います:

def combine_items(seq):
    it = iter(seq) # get an iterator

    yield next(it) # yield the first three items unmodified
    yield next(it)
    yield next(it)

    while True: # run until there's an exception
        first = next(it) # grab the first item in a pair
        try:
            second = next(it) # grab the second
            yield first + second # yield the combined pair
        except StopIteration: # if the second was off the end of the sequence
            yield first  # yield the first item unmodified
            raise # and reraise the exception to exit

whileループは、シーケンスが完全に消費されるまで実行されます。これ以上アイテムがなくなると、ジェネレーターが完了したというシグナルであるため、これを伝播させますnextStopIteration

リストで出力を取得するには、listコンストラクターでジェネレーターへの呼び出しをラップするだけです。

>>> list(combine_items(info))
['1', 'be/4', 'root', '0.00B', '0.00B', '0.00%', '0.00%', 'init']
于 2012-12-13T18:37:24.687 に答える
0

まあ、かなり単純な方法は次のとおりです。

>>> lst[:] = lst[:3] + [lst[3] + lst[4], lst[5] + lst[6], lst[7] + lst[8], lst[9] + lst[10], lst[11]] + [lst[11]]
[u'1', u'be/4', u'root', u'0.00B', u'0.00B', u'0.00%', u'0.00%', u'init']

これは、既存のリストから新しいリストを作成し、その新しいリストを作成するだけlstです。

ただし、ペアリングを処理するおしゃれな関数を作成できます...

わかりやすくするために、コードを次のようにフォーマットできます。

lst[:] = (
    lst[:3] +
    [
        lst[3] + lst[4],
        lst[5] + lst[6],
        lst[7] + lst[8],
        lst[9] + lst[10]
    ] +
    [lst[11]]
)

これにより、スライス、ペアリング、エンディングがどこにあるかがかなり明確になります...

単一の文字フィールドを移動するが、十分にテストされていない別のオプション:

>>> text = '\t'.join(lst)
>>> re.sub('\t(.)\t', r'\1\t', text).split('\t') # or use ([B%]) instead maybe
[u'1', u'be/4', u'root', u'0.00B', u'0.00B', u'0.00%', u'0.00%', u'init']
于 2012-12-13T18:35:01.823 に答える
0

どうですか

>>> to_join = iter(info[3:-1])

>>> info[:3] + [x + next(to_join) for x in to_join] + info[-1:]
[u'1', u'be/4', u'root', u'0.00B', u'0.00B', u'0.00%', u'0.00%', u'init']
于 2012-12-13T18:36:33.050 に答える