![](/img/trans.png)
[英]Python/Pandas for loop through a list only working on the last item in the list
[英]How to loop through all but the last item of a list?
我想遍历一个列表,将每个项目与它后面的项目进行对照。
有没有一种方法可以遍历除最后一项以外的所有项,以便在y中使用x? 如果可以的话,我宁愿不使用索引就这样做。
注意
freespace回答了我的实际问题,这就是为什么我接受答案,但是SilentGhost回答了我应该问的问题。
抱歉造成混乱。
for x in y[:-1]
如果y
是发电机,则以上方法将无效。
比较序列项与以下内容的最简单方法:
for i, j in zip(a, a[1:]):
# compare i (the current) to j (the following)
如果要成对获取序列中的所有元素,请使用这种方法(成对函数来自itertools模块中的示例)。
from itertools import tee, izip, chain
def pairwise(seq):
a,b = tee(seq)
b.next()
return izip(a,b)
for current_item, next_item in pairwise(y):
if compare(current_item, next_item):
# do what you have to do
如果需要将最后一个值与某个特殊值进行比较,则将该值链接到末尾
for current, next_item in pairwise(chain(y, [None])):
如果您要比较列表中的第n个项目与第n + 1个项目,则也可以使用
>>> for i in range(len(list[:-1])):
... print list[i]>list[i+1]
请注意,那里没有硬编码。 除非您另有感觉,否则应该可以。
要在迭代器中将每个项目与下一个项目进行比较而不实例化列表:
import itertools
it = (x for x in range(10))
data1, data2 = itertools.tee(it)
data2.next()
for a, b in itertools.izip(data1, data2):
print a, b
这回答了OP 应该问的问题 ,即遍历比较连续元素的列表(出色的SilentGhost答案),但对任何组( n-gram )都可以推广:2、3,... n
:
zip(*(l[start:] for start in range(0, n)))
例子:
l = range(0, 4) # [0, 1, 2, 3]
list(zip(*(l[start:] for start in range(0, 2)))) # == [(0, 1), (1, 2), (2, 3)]
list(zip(*(l[start:] for start in range(0, 3)))) # == [(0, 1, 2), (1, 2, 3)]
list(zip(*(l[start:] for start in range(0, 4)))) # == [(0, 1, 2, 3)]
list(zip(*(l[start:] for start in range(0, 5)))) # == []
说明:
l[start:]
从索引start
生成一个列表/生成器 *list
或*generator
:将所有元素传递到封闭函数zip
就像写成zip(elem1, elem2, ...)
注意:
AFAIK,此代码尽可能地懒惰。 未经测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.