列表中重复值的序列

时间:2018-12-05 15:53:45

标签: python arrays python-3.x list

我在程序方面遇到问题,希望有人可以帮助我解决此问题。基本上,我有一个随机生成的列表,其中包含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 :(得分:4)

或者,您可以使用itertools.groupby来将等值分组到列表中,然后将其括在括号中。

npm install

答案 1 :(得分: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

答案 2 :(得分:1)

只需在内部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

答案 3 :(得分:1)

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

[[:space:]]

答案 4 :(得分: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))