web-dev-qa-db-ja.com

Python-リスト内の同じ値を検索し、新しいリストをグループ化する

私はこれを理解するのにこだわっており、誰かが私を正しい方向に向けることができるかどうか疑問に思っています...

このリストから:

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

私は作成しようとしています:

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

同じであることが判明した値は、それ自身のサブリストにグループ化されます。ここに私の試みがありますが、whileループを使用する必要があると考えていますか?

global n

n = [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5] #Sorted list
l = [] #Empty list to append values to

def compare(val):
   """ This function receives index values
   from the n list (n[0] etc) """

   global valin
   valin = val

   global count
   count = 0

    for i in xrange(len(n)):
        if valin == n[count]: # If the input value i.e. n[x] == n[iteration]
            temp = valin, n[count]
             l.append(temp) #append the values to a new list
             count +=1
        else:
          count +=1


for x in xrange (len(n)):
    compare(n[x]) #pass the n[x] to compare function
16
Siii

誰かがN=[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 1]取得します[[1], [2, 2], [3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5, 5], [1]]

言い換えれば、リストの番号が順番になっていないか、それが混乱したリストである場合、それは利用できません。

したがって、この問題を解決するためのより良い答えがあります。

from collections import Counter

N = [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5]
C = Counter(N)

print [ [k,]*v for k,v in C.items()]
17
Burger King

落ち着いて itertools.groupby

from itertools import groupby

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

print([list(j) for i, j in groupby(N)])

出力:

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

補足:needを必要としない場合は、グローバル変数を使用しないようにしてください。

31
Sam Bruns

itertools.groupby とともに リスト内包表記

>>> l =  [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5]
>>> [list(v) for k,v in itertools.groupby(l)]
[[1], [2, 2], [3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5, 5]]

これは、次のように変数Lに割り当てることができます。

L = [list(v) for k,v in itertools.groupby(l)]
4
Bhargav Rao

これは複雑すぎます。

あなたがしたいことは、各値について、それが最後の値と同じである場合、最後の値のリストにそれを追加するだけです。それ以外の場合は、新しいリストを作成します。その英語を直接Pythonに翻訳できます:

new_list = []
for value in old_list:
    if new_list and new_list[-1][0] == value:
        new_list[-1].append(value)
    else:
        new_list.append([value])

itertoolsのグループ化関数を使用するなど、もう少し抽象化したい場合は、さらに簡単な方法があります。しかし、これは理解しやすいはずです。


本当にwhileループでこれを行う必要がある場合は、forループを次のようにwhileループに変換できます。

for value in iterable:
    do_stuff(value)

iterator = iter(iterable)
while True:
    try:
        value = next(iterator)
    except StopIteration:
        break
    do_stuff(value)

または、反復可能要素がシーケンスであることがわかっている場合は、少し単純なwhileループを使用できます。

index = 0
while index < len(sequence):
    value = sequence[index]
    do_stuff(value)
    index += 1

しかし、これらの両方により、コードが読みにくくなり、Pythonが少なくなり、より複雑になり、効率が悪くなり、間違いを起こしやすくなります。

3
abarnert

あなたもnumpyを使用してそれを行うことができます:

import numpy as np

N = np.array([1,2,2,3,3,3,4,4,4,4,5,5,5,5,5])
counter = np.arange(1, np.alen(N))
L = np.split(N, counter[N[1:]!=N[:-1]])

この方法の利点は、Nに関連する別のリストがあり、同じ方法でリストを分割する場合です。

0
syviad