新列表最长的连续值

时间:2017-03-09 01:27:43

标签: python list

我希望程序输出一个列表,该列表包含PYTHON中L中相同值的连续出现的最长条纹。

如果多个值具有相同的条纹数,则选择最小值。

输入:

L=[2,4,3,3,3,5,6,7,7,7]

输出:

R=[3,3,3]

代码

R = L
i=0
for i in range(len(L)-1):
    if L[i]==L[i+1]:
    R=[L[i],L[i+1]]
    i=i+1
    else:
    R=[]
print('\nThe longest streak of the same value is:')
print('  ', R)

2 个答案:

答案 0 :(得分:0)

只需使用itertools.groupby

即可
>>> from itertools import groupby
>>> longest = max((list(g) for _, g in groupby(L)), key=len)
>>> longest
[3, 3, 3]

实际上有两组3,所以我认为你想要第一组这样的组。

groupby返回两件事。分组元素和组,我们只关心后者。因此,我们仅列出石斑鱼元素的列表,使用list将石榴石对象转换为没有len函数的石斑鱼对象。

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

我注意到你要求选择具有最低值的项目,而不是列表中的第一项。这使问题复杂化了一点。虽然您的代码不会为此付出代价,但这是一个解决方案。

相反,现在您必须创建一个长度为max的元素的列表,并选择值较低的值。

尝试在单行中执行此操作可能会有点多。

[[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来电并查看是否选择了不同的条目。

或者更简单地说,正如@ShadowRanger在评论中指出的那样,你可以从关键函数返回一个长度和否定值的元组,以便在长度达到平局时支持更低的值。要支持更大的值,请删除否定。

max

答案 1 :(得分:0)

下面的python代码也会这样做。 @Paul的版本更像是Pythonic

{data:
[{"Sales1": "100", "Sales2": "200", "Sales3": "400"},
 {"Sales1": "150", "Sales2": "250", "Sales3": "450"}]};