2016-09-12 5 views
2

に基づく指標に分割リストあなたは私が意味する値の数によってリストを分割するためのスクリプトを書く方法を私にアドバイスすることができれば:Pythonの:連続して同じ値

my_list =[11,11,11,11,12,12,15,15,15,15,15,15,20,20,20] 

そしてあります11-4,12- 2,15-6,20-3アイテム。 したがって、exsample range(0:100)の次のリスト 私は4,2,6,3の部分に分割する必要があります 分割されたリストに対して同じ値と機能を数えましたが、リストとは関係ありません:

div=Counter(my_list).values() ##counts same values in the list 

def chunk(it, size): 
    it = iter(it) 
    return iter(lambda: tuple(islice(it, size)),()) 

私は何が必要です:

Out: ([0,1,2,3],[4,5],[6,7,8,9,10,11], etc...] 
+1

チェックアウト'itertools.groupby()'と 'enumerate()'です。 –

+0

'def get_chunks(li、n):;範囲内のi(0、len(li)、n)に対しては です。yield li [i:i + n] 'このスライスは' 'li''をサイズ' n'のチャンクにリストします(最後のチャンクは '<= n'値を持ちます)。あなたのニーズに合わせて変更する方法を見てください。 – DeepSpace

+0

@DeepSpace主な問題は何ですか、私はサイズ(n)のようなリストを使用することはできません。l1 = [3,2,4、] #size of parts'。私はl2 = [10,15,9,2,0,5,6,3,9]に分割する必要があります。結果は以下のようになります:res = [[10,15,9]、[9,2]、[0,6,3,9]] –

答えて

1

各タプル(列挙)の最初の項目を使用する:

from collections import Counter 
my_list =[11,11,11,11,12,12,15,15,15,15,15,15,20,20,20] 
count = Counter(my_list) 
div= list(count.keys())   # take only keys 
div.sort() 
l = [] 
num = 0 
for i in div: 
    t = [] 
    for j in range(count[i]): # loop number of times it occurs in the list 
     t.append(num) 
     num+=1 
    l.append(t) 
print(l) 

出力:

[[0, 1, 2, 3], [4, 5], [6, 7, 8, 9, 10, 11], [12, 13, 14]] 

を使用した代替ソリューション10:

my_list =[11,11,11,11,12,12,15,15,15,15,15,15,20,20,20] 
val = set(my_list)      # filter only unique elements 
ans = [] 
num = 0 
for i in val: 
    temp = [] 
    for j in range(my_list.count(i)): # loop till number of occurrence of each unique element 
     temp.append(num) 
     num+=1 
    ans.append(temp) 
print(ans) 

編集:私はここで

[[54, 21, 12, 45], [78, 41], [235, 7, 10, 4, 1, 1], [897, 5, 79]] 

:@Protossリード

my_list =[11,11,11,11,12,12,15,15,15,15,15,15,20,20,20] 
val = list(set(my_list))      # filter only unique elements 
val.sort()         # because set is not sorted by default 
ans = [] 
index = 0 
l2 = [54,21,12,45,78,41,235,7,10,4,1,1,897,5,79] 
for i in val: 
    temp = [] 
    for j in range(my_list.count(i)): # loop till number of occurrence of each unique element 
     temp.append(l2[index]) 
     index+=1 
    ans.append(temp) 
print(ans) 

出力によって、コメントに言及して、所望の出力を得るために行われ、必要な変更を1として setlistに変換すると、setはソートされていないと思いますelfの説明。

別ソリューションの入力は常に(OrderedDictを使用して)ソートされていない場合:

from collections import OrderedDict 
v = OrderedDict({}) 
my_list=[12,12,11,11,11,11,20,20,20,15,15,15,15,15,15] 
l2 = [54,21,12,45,78,41,235,7,10,4,1,1,897,5,79] 
for i in my_list:    # maintain count in dict 
    if i in v: 
     v[i]+=1 
    else: 
     v[i]=1 
ans =[] 
index = 0 
for key,values in v.items(): 
    temp = [] 
    for j in range(values): 
     temp.append(l2[index]) 
     index+=1 
    ans.append(temp) 
print(ans) 

出力:私は予測不可能なランダムで入力シーケンスの順序を(維持するためにOrderedDictを使用ここで

[[54, 21], [12, 45, 78, 41], [235, 7, 10], [4, 1, 1, 897, 5, 79]] 

)の場合はsetです。

私は@Ami Tavoryの方がよりPythonの方が良いですが。

[エキストラの仕事:誰もがlist comprehensionにこのソリューションを変換することができた場合は、私がしようとしたが、list comprehensionに変換することができないとあなたはコメントでそれを投稿してください成功すれば、それは私が理解するのに役立ちますので、それは素晴らしいだろう]

+0

ありがとうございました!コードはうまくいきますが、私は、 'my_list'から必要な部分(4,2,6,3)の' div'や 'set'を必要としていますが、それはいいですが、何が主な質問なのですか? L2 = [54.21,12,45,78,41,235,7,10,4,1,1,897,5,79] ' 結果は次のようになります:' res = [[54,21,12,45]、[78 、41]、[235,7,10,4,1,1]、[897,5,79] ' –

+0

@Protoss Reed私は答えに変更を加えました。お役に立てれば。 –

+0

Heyy!完璧に動作します!ありがとう!あなたは偉大な仕事をしました!しかし、あなたが気にしないなら、この重要なソートリストは説明できますか?私はそれからいくつかの部分だけが必要なので。しかし特別な順序で。 My_listは必ずしもそのように見えるわけではありません(ソートされたもの)、乱数になる可能性があります。 'my_list = [23,23,23,1,1,1,1,44,6542,6542..etc]' –

3

あなたはenumerateitertools.groupby、およびoperator.itemgetterを使用することができます。

In [45]: import itertools 

In [46]: import operator 

In [47]: [[e[0] for e in d[1]] for d in itertools.groupby(enumerate(my_list), key=operator.itemgetter(1))] 
Out[47]: [[0, 1, 2, 3], [4, 5], [6, 7, 8, 9, 10, 11], [12, 13, 14]] 

これは次のようになります。

  1. まず、アイテムを列挙します。

  2. 各列挙タプルの2番目の項目(元の値)を使用して、それらをグループ化します。群当たり得られたリストで

  3. だけcounterを使用している場合、それは、Pythonの3溶液

+0

うまく機能します。私は意味:my_list(ここで私は部品の数を取得)と2番目のリストのインスタンスmy_data = [10,9,8,7,6,100,45,12,4]分割。実際に私は初心者ですので、私の愚かな質問には申し訳ありません –

+0

私の謝罪。今はコンピュータの前ではなく、これを後で見ることができます。 –

+0

=)心配=)時間をかけてください –

関連する問題