2017-11-15 16 views
1

リストを受け取り、繰り返し要素で別のリストを返す関数を作成しようとしています。リストの要素を繰り返しグループ化する

たとえば、入力A = [2,2,1,1,3,2](リストはソートされていません)の場合、この関数はresult = [[1,1], [2,2,2]]を返します。結果をソートする必要はありません。

私はすでにWolfram Mathematicaでやったことがありますが、これをpython3に変換する必要があります。MathematicaにはSelect、Map、Splitなどのいくつかの機能があります。

+0

リストはソートされていますか? – Engineero

答えて

3
result = [[x] * A.count(x) for x in set(A) if A.count(x) > 1] 
を行うことができます
+0

nice!あなたはこれをすべてインラインで行うことができるので、セットを使うとは思わなかった。あなたは本当に最後に条件付きを必要としない、それはそれなしでかわいいです –

+0

うわー - さらに良い –

+0

優秀:Dありがとうございます。 – Gabriela

2

シンプルなアプローチ:

def grpBySameConsecutiveItem(l): 
    rv= [] 
    last = None 
    for elem in l: 
     if last == None: 
      last = [elem] 
      continue 
     if elem == last[0]: 
      last.append(elem) 
      continue 
     if len(last) > 1: 
      rv.append(last) 
     last = [elem] 
    return rv 


print grpBySameConsecutiveItem([1,2,1,1,1,2,2,3,4,4,4,4,5,4]) 

出力:あなたはそれをソートしたり、inputlistを並べ替えしたい場合は、あなたはもはや連続で同じ番号を取得wouldntは、その後、あなたの出力をソートすることができ

[[1, 1, 1], [2, 2], [4, 4, 4, 4]] 

しかし、。

すべての内部リストが同一であるため、インデックスに応じてリストのリストを並べ替える方法については、https://stackoverflow.com/a/4174955/7505395を参照してください(0を使用します)。

def grpByValue(lis): 
    d = {} 
    for key in lis: 
     if key in d: 
      d[key] += 1 
     else: 
      d[key] = 1 
    print(d)  

    rv = [] 
    for k in d: 
     if (d[k]<2): 
      continue 
     rv.append([]) 
     for n in range(0,d[k]): 
      rv[-1].append(k) 
    return rv 



data = [1,2,1,1,1,2,2,3,4,4,4,4,5,4] 

print grpByValue(data) 

出力:

[[1, 1, 1, 1], [2, 2, 2], [4, 4, 4, 4, 4]] 
+0

私はあなたの答えを感謝しますが、私が探している出力ではありません。その入力に対して、出力は[[1,1,1,1]、[2,2,2]、[4,4,4,4]](ソート不要)である必要があります。リスト全体で繰り返される要素だけ。 – Gabriela

+0

@Gabriela:その簡単な解決策。あなたの入力を最初にソートする - そして、同じ数字がソートによってグループ化され、algoがあなたの出力を与えます(それは何のためのアルゴ名を参照してください:o))。 –

+0

@Gabriela:2。実装:辞書にカウントし、dictからリストを作成します:)出力は今すぐOKになるはずです –

1

をあなたは可能性がこれは連続したものを無視して、単にそれらをすべて収集します

を使用した場合に非常に賢く見えること - あなたはまた、itertools - it hast things like TakeWhileを使用することができ

リストの理解でこれを行う:

A = [1,1,1,2,2,3,3,3] 
B = [] 
[B.append([n]*A.count(n)) for n in A if B.count([n]*A.count(n)) == 0] 

出力pythonically [[1,1,1],[2,2],[3,3,3]]

以上:

A = [1,2,2,3,4,1,1,2,2,2,3,3,4,4,4] 
B = [] 
for n in A: 
    if B.count([n]*A.count(n)) == 0: 
     B.append([n]*A.count(n)) 

出力[[1,1,1],[2,2,2,2,2],[3,3,3],[4,4,4,4]]ソートまたはソートされていないリストを

作品あなたが手の前にリストをソートする必要がある場合、あなたはfor n in sorted(A)

+0

非常に短い、涼しい。 –

1

これはの仕事です。 x各要素を反復し、A.count(x)にチェックすると、O(N^2)の複雑さがあります。 Counter()は、各要素が1回のパスで繰り返し使用できる回数を数えます。そして、その辞書を反復して結果を生成することができます。

>>> from collections import Counter 
>>> A = [2,2,1,1,3,2] 
>>> counts = Counter(A) 
>>> result = [[key] * value for key, value in counts.items() if value > 1] 
>>> result 
[[2, 2, 2], [[1, 1]] 
関連する問題