Python 列表中重复值的序列
我有一个程序的问题,我希望有人能帮助我解决这个问题。基本上,我有一个随机生成的20个值的列表,我想把重复的值放在括号中(例如,如果列表是Python 列表中重复值的序列,python,arrays,python-3.x,list,Python,Arrays,Python 3.x,List,我有一个程序的问题,我希望有人能帮助我解决这个问题。基本上,我有一个随机生成的20个值的列表,我想把重复的值放在括号中(例如,如果列表是[1,2,2,4,5]它应该显示1(2)4 5) 下面是我的代码,它只在最后没有重复值的情况下工作,因为列表索引超出了范围。我怎样才能解决这个问题 from random import randint lanci = [] for i in range(20): x = randint(1,6) lanci.append(x) print(lan
[1,2,2,4,5]
它应该显示1(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
来自随机导入randint
lanci=[]
对于范围(20)内的i:
x=randint(1,6)
lanci.append(x)
印刷品(兰奇)
i=0
当i
与更为手动的方法不同,您可以使用在列表中分组相等的值,然后将这些值括在括号中:
>>> 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)'
不是最漂亮的,但可以做到:
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
只需在内部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
来自随机导入randint
lanci=[]
对于范围(20)内的i:
x=randint(1,6)
lanci.append(x)
印刷品(兰奇)
i=0
当i
将数字列表转换为字符串,然后可以使用此函数。
如果您需要再次返回列表,请将其拆分
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
这是仅使用基本列表的另一个选项:
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))
首先,您需要修复所提供代码段中的语法错误。例如:print(lanci[i],end=”“未用a关闭)。和while-iOk一样,谢谢,我修复了它们,虽然我没有复制粘贴,但我复制了它,这就是为什么它有语法错误。但问题是,如果列表的最后一个值在重复序列中,它会告诉我索引i超出范围,但我无法修复它。我会在
itertools.groupby
的帮助下,开始将[1,2,2,4,5]
转换为[1,2,2,4,5]
。然后,将整数转换为字符串,将子列表转换为括号序列应该是一个简单的练习。(就像我在键入时tobias_k所做的:)[1,2,2,4,5,6]
所需的输出是什么?tmp=[g for ug,g in itertools.groupby(map(str,lst))]
。现在还不需要将g
转换为列表,因为您只需立即对它们进行迭代即可。@chepner True,但您无法获得groupy组的len
,对吗?(tmp
不一定是一个列表,也可以是一个生成器,我只是想提供一种简单的方式来查看组,同时避免在查看后出现关于生成器已耗尽的明显后续问题)有趣的是,我们如何得到几乎相同的结果,+1为您@zipa引用了导入这个:“应该有一个——最好只有一个——显而易见的方法来实现它。”:-)@tobias_k啊,对,你需要像这样的东西。。。对于图中的g(list,tmp)
,在这种情况下,在join
的生成器表达式中。首先将列表转换为字符串的目的是什么?如果是多位数的数字,更不用说其他内容的列表(例如字符串列表),这不是很困难吗?另外,字符串输入是什么样子的<代码>str(lst)
,或''。连接(lst)
,或如何连接?因为最终输出是一个字符串,否则您可以使用返回列表而不是返回字符串。。。您可以附加/扩展列表,而不是添加到字符串中。对于多位数的数字,只能将其作为列表处理。要转换为字符串,必须将数字映射为连接字符串。但这只有在数字只有一位数时才有用。在本例中,数字介于1-6之间,这一点非常清楚。问题是,您编写的输入是一个字符串,显然该字符串的格式很重要,而且该字符串有许多不同的外观方式(请参见第一条注释),但您从来没有说它应该是什么样子,也没有给出一个示例。如果没有这一点,这个解决方案就不是真正可测试的,更不用说可用了。谢谢,你说得很好。我认为,为了使它更通用于指定的问题,它可以被修改,应该接受一个列表并相应地处理。哦,天哪,我不知道如果你给出两个错误的陈述,它会在第一个停止,而不会检查另一个,非常感谢@Tyler99,是的,这是一个非常方便的特性:它可以使您拥有一个if语句/块,而不必嵌套——更可读,更频繁。