我希望程序输出一个列表,该列表包含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)
答案 0 :(得分:0)
>>> 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"}]};