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

Ответ 1

Кто-то упоминает о 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()]

Ответ 2

Сохраняйте спокойствие и используйте 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]]

Боковое примечание. Предотвратите использование глобальной переменной, когда вам это не нужно.

Ответ 3

Вы это слишком смущаете.

Что вы хотите сделать: для каждого значения, если оно совпадает с последним значением, просто добавьте его в список последних значений; в противном случае создайте новый список. Вы можете перевести этот английский непосредственно на 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

Но оба эти кода делают ваш код менее читаемым, менее Pythonic, более сложным, менее эффективным, легче ошибиться и т.д.

Ответ 4

Вы можете использовать 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)]

Ответ 5

Другое немного другое решение, которое не полагается на itertools:

#!/usr/bin/env python

def group(items):
    """
    groups a sorted list of integers into sublists based on the integer key
    """
    if len(items) == 0:
        return []

    grouped_items = []
    prev_item, rest_items = items[0], items[1:]

    subgroup = [prev_item]
    for item in rest_items:
        if item != prev_item:
            grouped_items.append(subgroup)
            subgroup = []
        subgroup.append(item)
        prev_item = item

    grouped_items.append(subgroup)
    return grouped_items

print group([1,2,2,3,3,3,4,4,4,4,5,5,5,5,5])
# [[1], [2, 2], [3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5, 5]]