我的清单上有一系列的物品。我想识别相同元素的运行,并打印它们的开始和结束位置。例如,有:
content=[c,c,c,c,f,f,f,f,c,c,b,b,b,b...]
我希望输出如下:
1-4 c
5-8 f
9-10 c
以此类推。到目前为止,我的情况如下:
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]
发布于 2016-05-24 03:22:32
第一个问题不是if
和else
,而是如何循环。您似乎错过了对range
的调用,并且只有调用的参数。尝试:
for i in range(0, x):
现在将到达if
和else
块,您只需调整它们以跟踪所关心的值。如果您想要开始和连续运行的项目,您实际上不需要这两个部分。试试这个:
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
语句来检查i
和run_start
是否相等(或者打印其他内容,或者跳过运行)。
我发现,在可能的情况下,使用有意义的变量名是非常有用的。在这种情况下,我使用的是run_start
,而不是y
或x
。
发布于 2016-05-24 03:59:46
布莱克恩特的解决方案很棒。我自己的版本更冗长,以免帮助您理解整个过程背后的逻辑。您需要做的是遍历列表中的每个元素,并将其存储在current
中,并将其与来自上一次迭代的last
(最后已知的对象)进行比较。如果它们是相同的,则增加range_end
索引。如果它们是不同的,那么这意味着一个新的范围正在开始,所以您必须做以下几件事情:
range_begin
、range_end
和current
元素。current
元素存储在last
中,因为它是新序列的第一个元素range_begin
和range_end
设置为当前的i
要使整个过程正常工作,您需要在循环到last
列表的第一个元素之前初始化content
。
而且,由于索引i
是基于0的,所以当我们同时打印range_begin
和range_end
时,只需将它们增加1。
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://stackoverflow.com/questions/37403444
复制相似问题