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]]