列表中重复值的序列

问题描述 投票:2回答:5

我有一个程序的问题,我希望有人可以帮我解决这个问题。基本上我有一个包含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  
python arrays python-3.x list
5个回答
4
投票

您可以使用itertools.groupby对列表中的相等值进行分组,然后将其包含在parens中:

>>> 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)'

1
投票

不是最漂亮但会做到的:

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

1
投票

只需检查内部while循环之前的“last element”。

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

1
投票

将数字列表转换为字符串,然后您可以使用此功能。如果您再次需要列表,请拆分它。

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
投票

这是使用基本列表的另一个选项:

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))
© www.soinside.com 2019 - 2024. All rights reserved.