1

これを行う簡単な方法があるはずですが、頭を包むことができないようです。私は次のようなリストを持っています、

l = [3,3,3,4,4,4,4,2,2,2,2,3,3,3,3,3,3,3,3,3,2,2,5,5,5,5,5,3,3,3,3,3,3] 

これは、整数で指定された回数だけ繰り返す整数​​のリストです。たとえば、リスト内の整数が 5 の場合、5 回繰り返します。リストの構造を保持し、次のように変換したいと思います。

l = [3,-1,-1,4,-1,-1,-1,2,-1,2,-1,3,-1,-1,3,-1,-1,3,-1,-1,2,-1,2,-1,5,-1,-1,-1,-1,3,-1,-1,3,-1,-1]

繰り返される整数を -1 に置き換えます。最初の整数 N を保持し、その後ろの繰り返し整数を N-1 -1 に置き換えたいと思います。私の問題は、同じ整数が隣り合っている場合です。その場合、私は得ています、

l = [3,-1,-1,4,-1,-1,-1,2,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,5,-1,-1,-1,-1,3,-1,-1,-1,-1,-1] 

誰でもこれを解決する方法を考えることができますか?

これまでのところ、コードはありますが、

def idx(List):
    xList = []
    xList.append(List[0])
    for i in range(0, len(List)):
        if (i+1) in range(len(List)):
            if List[i] == List[i+1]:
                xList.append(-1)
            elif tscList[i] != List[i+1]:
                xList.append(List[i+1])
        else:
            break
    return xList

整数の繰り返しは考慮されません。ループ内の整数の位置をリセットするか、カウントし続けることなくカウントする簡単な方法が本当にわかりません。

これについて助けてくれてありがとう。

4

4 に答える 4

4

を使用する方が簡単でitertools.groupby()、反復マジックを使用して目的の出力を生成します。

from itertools import groupby, cycle

output = [res for k, g in groupby(l) for orig, res in zip(g, cycle([k] + [-1] * (k - 1)))]

これにより、次が生成されます。

>>> from itertools import groupby, cycle
>>> l = [3,3,3,4,4,4,4,2,2,2,2,3,3,3,3,3,3,3,3,3,2,2,5,5,5,5,5,3,3,3,3,3,3] 
>>> [res for k, g in groupby(l) for orig, res in zip(g, cycle([k] + [-1] * (k - 1)))]
[3, -1, -1, 4, -1, -1, -1, 2, -1, 2, -1, 3, -1, -1, 3, -1, -1, 3, -1, -1, 2, -1, 5, -1, -1, -1, -1, 3, -1, -1, 3, -1, -1]

groupby()同等の重要な機能グループはありません。同じ繰り返し数のグループを取得します。したがって、最初に3グループ内の s を取得し、次に4s などを取得します。次に、グループ番号のサイクル iterable とそれに続く-1カウントの残りを置き換えるのに十分な値で各グループを圧縮します。グループの長さによって、サイクリングの頻度が決まります。zip()最短のイテラブル ( g、グループ) が完了すると停止します。したがって、[2, 2, 2, 2]サイクリングと組み合わせると に[2, -1]なり[2, -1, 2, -1]ます。

于 2013-10-29T01:10:22.277 に答える
0

たとえば、 a をヒットするとすぐに3、次の 2 つの項目を ... に置き換えたいことがわかります-1。したがって、単純な解決策の 1 つは、スライスに割り当てて、それらを置き換えることです。

>>> my_list = [3, 3, 3, 4, 4, 4, 4, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2,
...            5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3]
>>> for i, x in enumerate(my_list):
...     if x != -1:
...         my_list[i+1:i+x] = [-1] * (x - 1)
... 
>>> my_list
[3, -1, -1, 4, -1, -1, -1, 2, -1, 2, -1, 3, -1, -1, 3, -1, -1, 3, -1, -1, 2, -1,
 5, -1, -1, -1, -1, 3, -1, -1, 3, -1, -1]
于 2013-10-29T01:20:15.883 に答える