Попытка сделать функцию, которая упрощает список целых чисел, группируя повторы - PullRequest
0 голосов
/ 07 ноября 2019

Я хочу создать функцию в Python, которая принимает список с более чем 1 элементом числовых упорядоченных целых чисел в качестве входных данных и возвращает список тех же самых целых чисел в качестве выходных данных, но любые повторы группируются в собственном спискес этим списком, являющимся элементом в возвращаемом списке функцией. Например:

[3,3,4,4,4,5,6,6] будет возвращено как [[3,3],[4,4,4],5,[6,6]]

Я пытался встроить несколько операторов if для каждого условия, но это слишком запутанно, слишком быстро.

def simplify(mylist):
    if len(mylist) > 1:
        newlist = []
        for i in range(0, len(mylist) - 1):
            if (mylist[i] == mylist[i + 1]):
                count = 2
                group = [mylist[i], mylist[i]]
                while (i + count) <= (len(mylist) - 1):
                    if mylist[i] == mylist[i + count]:
                        group.append(mylist[i])
                        count += 1
                    else:
                        newlist.append(group)
                        break
            else:
                newlist.append(mylist[i])
        print(newlist)
        return (newlist)

Таким образом, я ожидал, что он сделает то, что описал, что должна делать функция, но затем получился список с повторяющимися элементами, списки которых уменьшались на один элемент до тех пор, пока он не закончил итерацию и не добавил последнее значение. Пример:

вход [3,4,4,4,4,5]

возвращено [3,[4,4,4,4],[4,4,4],[4,4],4]

Ответы [ 3 ]

2 голосов
/ 07 ноября 2019

Учитывая, что уже отсортировано , вы должны просто использовать itertools.groupby

from itertools import groupby

def simplify(mylist):
     return [list(group) for key, group in groupby(mylist)]

Это даст вам:

In [14]: simplify([3, 3, 4, 4, 4, 5, 6, 6])
Out[14]: [[3, 3], [4, 4, 4], [5], [6, 6]]
1 голос
/ 07 ноября 2019

Использование счетчика

from collections import Counter
mylist = [3,3,4,4,4,5,6,6]
C = Counter(mylist)
output=[ [key,]*val if val >1 else key for key,val in C.items()]
0 голосов
/ 07 ноября 2019

Я вижу, что вы не хотите, чтобы элемент был списком, если он встречался только один раз,

from collections import Counter
x = [3,3,4,4,4,5,6,6]
output_list = []
for key, value in Counter(x).items():
    if value != 1:
        output_list.append([key]*value)
    else:
        output_list.append(key)

print(output_list)

Вывод:

[[3, 3], [4, 4, 4], 5, [6, 6]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...