首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >标识重复列表项的运行

标识重复列表项的运行
EN

Stack Overflow用户
提问于 2016-05-24 02:29:31
回答 2查看 61关注 0票数 0

我的清单上有一系列的物品。我想识别相同元素的运行,并打印它们的开始和结束位置。例如,有:

代码语言:javascript
运行
复制
content=[c,c,c,c,f,f,f,f,c,c,b,b,b,b...]

我希望输出如下:

代码语言:javascript
运行
复制
1-4 c
5-8 f
9-10 c

以此类推。到目前为止,我的情况如下:

代码语言:javascript
运行
复制
x=len(content)-1
i=0
y=0
z=0
for i in range(0,x):
  if(content[i]==content[i+1]):
    y=y+1
    z=i-1
  else:
    print y
    print content[z]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-24 03:22:32

第一个问题不是ifelse,而是如何循环。您似乎错过了对range的调用,并且只有调用的参数。尝试:

代码语言:javascript
运行
复制
for i in range(0, x):

现在将到达ifelse块,您只需调整它们以跟踪所关心的值。如果您想要开始和连续运行的项目,您实际上不需要这两个部分。试试这个:

代码语言:javascript
运行
复制
run_start = 0
for i in range(len(content)-1):
    if content[i] != content[i+1]: # only one branch needed, nothing to do when items are ==
        print "{}-{} {}".format(run_start+1, i+1, content[i])
        run_start = i+1
print "{}-{} {}".format(run_start+1, len(content), content[-1]) # extra code for the last run

如果一次运行中只有一项,这将打印出像3-3这样的范围。如果您不想这样做,您可能需要添加另一个if语句来检查irun_start是否相等(或者打印其他内容,或者跳过运行)。

我发现,在可能的情况下,使用有意义的变量名是非常有用的。在这种情况下,我使用的是run_start,而不是yx

票数 1
EN

Stack Overflow用户

发布于 2016-05-24 03:59:46

布莱克恩特的解决方案很棒。我自己的版本更冗长,以免帮助您理解整个过程背后的逻辑。您需要做的是遍历列表中的每个元素,并将其存储在current中,并将其与来自上一次迭代的last (最后已知的对象)进行比较。如果它们是相同的,则增加range_end索引。如果它们是不同的,那么这意味着一个新的范围正在开始,所以您必须做以下几件事情:

  • 打印到目前为止学到的内容,包括range_beginrange_endcurrent元素。
  • current元素存储在last中,因为它是新序列的第一个元素
  • 将范围索引range_beginrange_end设置为当前的i

要使整个过程正常工作,您需要在循环到last列表的第一个元素之前初始化content

而且,由于索引i是基于0的,所以当我们同时打印range_beginrange_end时,只需将它们增加1。

代码语言:javascript
运行
复制
content=['c','c','c','c','f','f','f','f','c','c','b','b','b','b']
range_begin=0
range_end=0
last=content[0]  # store the first element as the last known
for i in range(0, len(content)):
  current = content[i]  # get the element from the list
  if last != current:   # compare to the last known, if different
    print "{}-{} {}".format(range_begin+1, range_end+1, last)  # print
    last = current      # store the current as last known
    range_begin = i     # reset the ranges to the current index
    range_end = i
  else:
    range_end = i       # if they are the same, just extend the range_end

也请查看:https://eval.in/575899

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37403444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档