2

文字列とタプルのリストがあります。タプルは次のようになります (数値、要素):

s = ["element1", (3, "element2"), (2, "element3")]

タプルを次のように出力する必要があります。

element1
element2
element2
element2
element3
element3

つまり、 number*element プリントが必要です。私が思いついた最高のものはこれでした:

s = ["element1", (3, "element2"), (2, "element3")]

def bb (x):
    for n in x:
        if isinstance (n, str):
           print (n)
        if isinstance (n, tuple):
            print (n[1])
4

2 に答える 2

2

理想的には、 が得られるように入力を変更します[(1, "element1,"), ...]が、それが不可能な場合:

import types
import itertools

s = ["element1", (3, "element2"), (2, "element3")]

print(list(itertools.chain.from_iterable((e, ) if isinstance(e, str) else itertools.repeat(e[1], e[0]) for e in s)))

私たちに与えます:

['element1', 'element2', 'element2', 'element2', 'element3', 'element3']

ここで行っているのは、要素を取得し、文字列の場合は要素をタプルに変換し (文字に反復されないようにするため)、要素がタプルの場合itertools.repeat()は指定された回数繰り返すイテレータを作成するために使用しています。次に、itertools.chain.from_iterable()このコレクションのコレクションを 1 つのイテレータにフラット化するために使用し、それをリストに変換します。

2.x に注意してくださいisinstance(e, basestring)

編集:代わりに:

args = ((e, 1) if isinstance(e, str) else (e[1], e[0]) for e in s)
itertools.chain.from_iterable(itertools.starmap(itertools.repeat, args))

それは同じことですが、私の意見では少しきれいかもしれません。

于 2012-12-02T21:21:13.050 に答える
-1

ここにワンライナーがあります:

s = ["element1", (3, "element2"), (2, "element3")]
result = sum(([x] if type(x) != tuple else x[0]*[x[1]] for x in s), [])

または、既存のコードを拡張します。

def bb(x):
    for n in x:
        if isinstance(n, str):
            print(n)
        elif isinstance(n, tuple):
            count, value = n
            for i in range(count):
                print(value)

これらの値を返したい場合は、ジェネレーターを使用することをお勧めします。

def bb_gen(x):
    for n in x:
        if isinstance(n, str):
            yield n
        elif isinstance(n, tuple):
            count, value = n
            for i in range(count):
                yield value

for value in bb_gen(s):
    print value
于 2012-12-02T21:17:14.657 に答える