Python 新列表最长的连续值条纹

Python 新列表最长的连续值条纹,python,list,Python,List,我想要一个程序,输出一个列表,其中包含PYTHON中L中相同值连续出现的最长条纹 如果多个值的条纹数相等,则选择最小值 输入: L=[2,4,3,3,3,5,6,7,7,7] 输出: R=[3,3,3] 代码 只用 实际上有两组3,所以我想你想要第一组 groupby返回两件事。分组元素和组,我们只关心后者。所以我们只列出grouper元素,使用list将它们从没有len函数的grouper对象转换过来 现在我们可以使用max来确定最大的元素,在出现平局时返回第一个这样的元素。我们需要使用一

我想要一个程序,输出一个列表,其中包含PYTHON中L中相同值连续出现的最长条纹

如果多个值的条纹数相等,则选择最小值

输入:

L=[2,4,3,3,3,5,6,7,7,7]
输出:

R=[3,3,3]
代码

只用

实际上有两组3,所以我想你想要第一组

groupby返回两件事。分组元素和组,我们只关心后者。所以我们只列出grouper元素,使用list将它们从没有len函数的grouper对象转换过来

现在我们可以使用max来确定最大的元素,在出现平局时返回第一个这样的元素。我们需要使用一个键函数,因为在列表上使用max本身没有意义。因此,传递len作为用于确定最大值的关键函数

我注意到您要求选择值最低的项目,而不是列表中的第一个项目。这使事情有点复杂。虽然您的代码没有努力解释它,但这里有一个解决方案

现在,您只需创建一个长度最长的元素列表[[3,3,3],[7,7,7]],然后选择值较低的值

试着在一行中完成这一点可能有点过分

from itertools import groupby
from operator import itemgetter
L=[2,4,3,3,3,5,6,7,7,7]

# list of groupers, converted to list
groups = [list(g) for _, g in groupby(L)]

# read longest value across all groups
longest = max(map(len, groups))

# filter any smaller groups from the list
# and find the entry with the lowest (min) number in it
result = min(filter(lambda g: len(g) == longest, groups), key=itemgetter(0))

print(result)
尝试将最后的min调用切换为max,并查看是否选择了不同的条目

或者更简单地说,正如@ShadowRanger在注释中指出的,您可以从key函数返回一个长度和否定值的元组,以便在长度相同的情况下使用较低的值。若要支持较大的值,请删除否定

longest = max((list(g) for _, g in groupby(L)), key=lambda g: (len(g), -g[0]))

下面的python代码也会这样做@保罗的版本更像是蟒蛇

lst = [2,4,3,3,3,5,6,7,7,7, 7]
n = len(lst)

# Store overall max consecutive length
max_len = 1
num = lst[0]

#  Store current consecutive length
cur_len = 1
cur_num = lst[0]

for i in range(1, n):
   if lst[i] == cur_num:
     cur_len += 1
   elif cur_len > max_len:
     max_len = cur_len
     num = cur_num   
     cur_num = lst[i]
     cur_len = 1
   else:
     cur_num = lst[i]


if cur_len > max_len:
    num = lst[-1]
    max_len = cur_len


print [num]*max_len

Xcode与此有什么关系?抱歉@Shawnicheghog你试过什么?贴出来,看看有什么不起作用,我们会帮忙的。你能提供你试过的代码吗?这不是我们为您做作业的论坛。@ShawnicHedgehog我已经粘贴了代码,将其全部推到C版本,以消除每个项目的字节码执行,从而在给定大输入时加快速度:maxmaplist、mapoperator.itemgetter1、itertools.groupbyit、key=lenFYI,对于数字大小写,使其返回最大长度的最小领带值仍然很容易。只需将密钥更改为lambda x:lenx,-x[0]。失去了我的所有C版本的C方面,但是你能做什么呢?
longest = max((list(g) for _, g in groupby(L)), key=lambda g: (len(g), -g[0]))
lst = [2,4,3,3,3,5,6,7,7,7, 7]
n = len(lst)

# Store overall max consecutive length
max_len = 1
num = lst[0]

#  Store current consecutive length
cur_len = 1
cur_num = lst[0]

for i in range(1, n):
   if lst[i] == cur_num:
     cur_len += 1
   elif cur_len > max_len:
     max_len = cur_len
     num = cur_num   
     cur_num = lst[i]
     cur_len = 1
   else:
     cur_num = lst[i]


if cur_len > max_len:
    num = lst[-1]
    max_len = cur_len


print [num]*max_len