2016-08-23 4 views
-1

私はgoogleとはどこにも行きません。私はこれを検索クエリにうまく組み込むことはできません。Pythonで別々のリストにゼロを分割する

私はこのリストを持っている:だから私は、上記の例では、コードを変更しました

asplit = [[23.1], [34.5]] 

EDIT:

a = [0.0, 0.0, 0.0, 23.1, 23.1, ... , 23.1, 0.0, ... , 0.0, 34.5, ..., 34.5, 0.0, 0.0, 0.0] 

私はこれにそれをしたいのですが。私はリストを持っています。つまり、正面に234のゼロがあり、次に23.1が90回繰り返され、次に987がゼロになり、次に65回の34.5回、次に34回のゼロが繰り返されます。

0以外の一意の値の数は、各一意の値の数と同様に異なります。また、各一意の数の間のゼロの数も異なります。数字がユニークではない可能性もありますが、それはほとんど起こりそうもなく、私は彼らがいるという前提を作る準備ができています。

一意の番号の順序を保持する必要があります。

私の最初の質問の漠然としたことを申し訳ありません。私は説明するのが難しいと思うが、私は答えが簡単だろうと確信している。リストa内の非ゼロの数字のすべての連続した実行の最初の要素を取得するには

+6

方法(ファスナー 'について* [(xはxの場合はx)] * 2) '? – vaultah

+1

問題の詳細な説明を教えてください。結果をどのように形成したいかははっきりしていません。最初のコメントで提案されている解決策は、結果が数字のペアで構成されていることを前提としていますが、あなたの質問には他の解釈があります。また、何を試したのか、具体的に何が問題になっているのかは不明です。 –

+0

@vaultah質問のタイトルから判断すると、私はそれがOPが望んでいるとは思わないが、私はそれが不明であることを認めている。 –

答えて

3

setを使用して達成することができます。以来、数の順序を保存する場合には、あなたが行うことができます:

エルス
>>> my_list = [23.1, 23.1, 23.1, 0.0, 0.0, 34.5, 34.5, 0.0, 0.0, 0.0] 
>>> seen = set() 
>>> seen_add = seen.add 
>>> [[x] for x in my_list if x and not (x in seen or seen_add(x))] 
[[23.1], [34.5]] 

順序は必要ではなかったならば、あなたは、単にそれを達成することができます経由:

>>> my_list = [23.1, 23.1, 23.1, 0.0, 0.0, 34.5, 34.5, 0.0, 0.0, 0.0] 
>>> map(lambda x: [x], set(x for x in my_list if x)) 
[[34.5], [23.1]] 
+0

OPはユニークな番号が出現する順序を保持する必要があると述べています._ – FujiApple

+0

答えを更新しました –

3

、あなたは

from itertools import groupby 
result = [next(vals) for k, vals in groupby(a, bool) if k] 

編集を使用することができます。コードは、更新され、質問に合致するようになって。

+0

OPは '[[23.1]、[34.5]]'を要求しましたが、これは '[23.1,34.5]'を出力します – FujiApple

+0

itertools.groupby(a、bool)のkに対してval [[next(vals) )[k] 'もちろん、 – FujiApple

2

ここで元の質問のための可能なソリューションです:あなたはサブリスト内の重複する要素を持ってしたくない場合は

import itertools 

a = [0.0, 0.0, 0.0, 23.1, 23.2, 0.0, 0.0, 0.0, 34.5, 34.6, 0.0, 0.0, 0.0] 
b = [list(x[1]) for x in itertools.groupby(a, lambda x: x == 0) if not x[0]] 
print(b) 

そして、ここでは、ソリューションです:

import itertools 

a = [0.0, 0.0, 0.0, 23.1, 23.2, 0.0, 0.0, 0.0, 34.5, 34.6, 0.0, 0.0, 0.0] 
b = [list(set(x[1])) for x in itertools.groupby(a, lambda x: x == 0) if not x[0]] 
print(b) 
+0

OPは[[23.1]、[34.5]]'を要求しますが、これは[[23.1,23.1,23.1]、[34.5,34.5]] ' – FujiApple

+0

を返します。私は彼が重複を削除することなくリストを分割したかったと思った。 – BPL

+0

@SvenMarnach私はFujiAppleが私を混乱させたと私は疑問を誤解していると思った。とにかく、今私は両方のソリューションを提供しました – BPL

1

別の解決策が、itertoolsなしで 編集: Opが質問をかなり変更したので、ここではOPに合った別のソリューションが必要です

# init the loop 
i = 0 
asplit = [] 
last = None 
while i < len(a)-1: 
    # add non-zero number, that is new 
    cand = a[i] 
    if cand != last and cand != 0.0: 
     last = cand 
     asplit.append([last]) 
    i += 1 
関連する問題