Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表中重复值的序列_Python_Arrays_Python 3.x_List - Fatal编程技术网

Python 列表中重复值的序列

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

我有一个程序的问题,我希望有人能帮助我解决这个问题。基本上,我有一个随机生成的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(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语句/块,而不必嵌套——更可读,更频繁。