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