2017-12-12 5 views
2

を返す私はこのようなリストがあるとします。チェックの継続性とユニーク

[1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 0.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0] 

を、私は1と-1年代の連続性を確認したいです。

予想される出力:連続した正と負の値の

[(1.0, 1.0), (-1.0, -1.0, -1.0, -1.0, -1.0), (1.0), (-1.0, -1.0, -1.0, -1.0, -1.0),....,(1.0), (0,0), (1.0, 1.0),(-1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0)] 

[1,-1,1,-1,....,1,0,1,-1] 

、それだけのものを返します。

私は少し混乱します。誰でも助けてくれ、正しい方法を教えてくれますか?

ご協力いただければ幸いです。

+1

'itertools.groupby(l)]の[tuple(g)の_、gですか? –

答えて

1

itertoolsからハイレベルのソリューションは、グルーピング隣接要素を含むであろう。これを行う方法は複数あります。私はitertoolsを使って純粋なpythonで1つを概説しました。それであなたが質問をタグ付けしたので、もう1つはpandasです。

Pythonの
itertools.groupby

from itertools import groupby 

r = [tuple(g) for _, g in groupby(lst)] 
r 
[(1.0, 1.0), (-1.0, -1.0, -1.0, -1.0, -1.0), (1.0,), (-1.0, -1.0, -1.0, -1.0, -1.0), (1.0,), (-1.0, -1.0), (1.0,), (-1.0, -1.0), (1.0,), (-1.0, -1.0, -1.0), (1.0, 1.0, 1.0), (-1.0, -1.0), (1.0,), (-1.0,), (1.0,), (-1.0,), (1.0, 1.0, 1.0, 1.0), (-1.0, -1.0), (1.0, 1.0, 1.0, 1.0, 1.0), (-1.0, -1.0, -1.0, -1.0), (1.0,), (-1.0,), (1.0,), (-1.0,), (1.0,), (-1.0,), (0.0,), (1.0, 1.0), (-1.0,), (1.0,), (-1.0, -1.0, -1.0, -1.0, -1.0, -1.0)] 

あなたはgroupbyから一意の値が必要な場合は、groupbyコールにわずかな変更を加える -

r = [i for i, _ in groupby(lst)] 

パンダ
groupby + shift + cumsum + apply

x = pd.Series(lst) 
r = x.groupby(x.ne(x.shift()).cumsum()).apply(tuple)  
r 

1        (1.0, 1.0) 
2   (-1.0, -1.0, -1.0, -1.0, -1.0) 
3         (1.0,) 
4   (-1.0, -1.0, -1.0, -1.0, -1.0) 
5         (1.0,) 
6        (-1.0, -1.0) 
7         (1.0,) 
8        (-1.0, -1.0) 
9         (1.0,) 
10      (-1.0, -1.0, -1.0) 
11       (1.0, 1.0, 1.0) 
12       (-1.0, -1.0) 
13         (1.0,) 
14         (-1.0,) 
15         (1.0,) 
16         (-1.0,) 
17     (1.0, 1.0, 1.0, 1.0) 
18       (-1.0, -1.0) 
19    (1.0, 1.0, 1.0, 1.0, 1.0) 
20    (-1.0, -1.0, -1.0, -1.0) 
21         (1.0,) 
22         (-1.0,) 
23         (1.0,) 
24         (-1.0,) 
25         (1.0,) 
26         (-1.0,) 
27         (0.0,) 
28        (1.0, 1.0) 
29         (-1.0,) 
30         (1.0,) 
31 (-1.0, -1.0, -1.0, -1.0, -1.0, -1.0) 
dtype: object 

一意の値を見つけるには、あなたはmeanuniqueを使用することができます。 -

r = x.groupby(x.ne(x.shift()).cumsum()).mean() 

私はmeanを使用しましたが、同じことをしています。

5

使用groupbyここ

>>> x = [1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 0.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0] 

>>> from itertools import groupby 
>>> print([tuple(j) for i, j in groupby(x)]) 

[(1.0, 1.0), (-1.0, -1.0, -1.0, -1.0, -1.0), (1.0,), (-1.0, -1.0, -1.0, -1.0, -1.0), (1.0,), (-1.0, -1.0), (1.0,), (-1.0, -1.0), (1.0,), (-1.0, -1.0, -1.0), (1.0, 1.0, 1.0), (-1.0, -1.0), (1.0,), (-1.0,), (1.0,), (-1.0,), (1.0, 1.0, 1.0, 1.0), (-1.0, -1.0), (1.0, 1.0, 1.0, 1.0, 1.0), (-1.0, -1.0, -1.0, -1.0), (1.0,), (-1.0,), (1.0,), (-1.0,), (1.0,), (-1.0,), (0.0,), (1.0, 1.0), (-1.0,), (1.0,), (-1.0, -1.0, -1.0, -1.0, -1.0, -1.0)] 
+1

ちょうどこれがpandasとタグ付けされていると言っています。また、 'groupby'ソリューションは私の最初のものでした:) –

+0

私は自分の表現をコンパイルするのに忙しかったのですが、コメントを投稿しました。あなたの感傷的なことを傷つけてしまったら、本当にすみません、次はどうしたらいいですか? –

+0

@akash、もし私が各タプルから平均値または一意の値を取りたいのならば。どうやってやるの? – Dheeraj

関連する問題