последовательность повторяющихся значений в списке - PullRequest
0 голосов
/ 05 декабря 2018

У меня проблемы с программой, я надеюсь, что кто-нибудь поможет мне это исправить.По сути, у меня есть случайный сгенерированный список с 20 значениями, и я хочу поместить в скобки значения, которые повторяются (например, если список равен [1,2,2,4,5], он должен отображать 1 ( 2 2 ) 4 5 ) Теперь вот мой код, который работает, только если нетповторное значение в конце, потому что индекс списка выходит за пределы диапазона. Как я могу это исправить?

from random import randint
lanci = []
for i in range(20):
    x = randint(1,6)
    lanci.append(x)
print(lanci)
i=0
while i < len(lanci)-1):
    if lanci[i] == lanci[i+1]:
        print("(",end=" ")
        print(lanci[i],end=" ")
        while lanci[i]==lanci[i+1]:
            i = i + 1 
            print(lanci[i],end=" ")
    print(")",end=" ")
else:
    print(lanci[i],end=" ")
    i = i + 1  

Ответы [ 5 ]

0 голосов
/ 06 декабря 2018

Это еще один вариант, использующий только базовый список:

def group_consecutives(lst):
  res, sub, memo = [None], [], None
  lst.append(memo)
  for x in lst:
    if memo == x:
      sub.append(memo)
      if res[-1] != sub: res.append(sub)
    else:
      sub.append(memo)
      if memo and not len(sub) > 1: res.append(memo)
      memo, sub = x, []
  return res[1:]

print(group_consecutives(lanci))
0 голосов
/ 05 декабря 2018

преобразовать список чисел в строку, тогда вы можете использовать эту функцию.разделите его, если вам нужен список снова.

def add_brackets(string):
    _character, _index = None, 0
    _return_string = ''
    for i, c in enumerate(string+ ' '):
        if _character is None or _character != c :
            if len(string[_index:i])>1:
                _return_string+='(' + string[_index: i] + ')'
            else:
                _return_string+=string[_index: i]
            _character, _index = c, i
    return _return_string
0 голосов
/ 05 декабря 2018

Не самый симпатичный, но сделаю это:

from random import randint
from itertools import groupby

lanci = [randint(1,6) for _ in range(20)]

result = [tuple(v) for _, v in groupby(lanci)]

print(*[i[0] if len(i) == 1 else '('+' '.join(map(str, i))+')' for i in result], sep=' ')
#(2 2) 3 5 3 1 5 4 6 2 1 4 6 4 (5 5) 3 6 3 4
0 голосов
/ 05 декабря 2018

Просто проверьте «последний элемент» перед вашим внутренним циклом while.

from random import randint

lanci = []
for i in range(20):
    x = randint(1,6)
    lanci.append(x)
print(lanci)
i=0
while i < len(lanci)-1):
    if lanci[i] == lanci[i+1]:
        print("(",end=" ")
        print(lanci[i],end=" ")
        while (i+1 < len(lanci)) and (lanci[i]==lanci[i+1]):
            i = i + 1 
            print(lanci[i],end=" ")
    print(")",end=" ")
    else:
        print(lanci[i],end=" ")
        i = i + 1
0 голосов
/ 05 декабря 2018

В качестве альтернативы вашему более ручному подходу вы можете использовать itertools.groupby, чтобы сгруппировать равные значения в списке, а затем заключить их в парены:

>>> import random, itertools
>>> lst = [random.randint(1, 5) for _ in range(20)]
>>> tmp = [list(map(str, g)) for k, g in itertools.groupby(lst)]
>>> ' '.join(g[0] if len(g) == 1 else "(" + " ".join(g) + ")" for g in tmp)
'5 4 1 2 1 4 (5 5) 4 5 1 5 4 3 (5 5) 3 (5 5 5)'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...