为了说明我的问题,假设我有一个list
,我想将每个元素与下一个元素进行比较,以检查它们是否具有相同的值。问题是,当我试图访问列表的最后一个元素并将其与“下一个”进行比较时,该元素超出了范围,所以我会得到错误。因此,为了避免这种情况,我在访问最后一个元素时设置了一个条件,这样就避免了比较。
list = [1, 2, 1, 1, 5, 6, 1,1]
for i in range(len(list)):
if i == len(list)-1:
print('Last element. Avoid comparison')
else:
if list[i] == list[i+1]:
print('Repeated')
我想应该有更有效的方法来做到这一点。例如,我试图在for循环的定义中设置条件,类似于这样:
for i in range(len(list)) and i < len(list)-1
但这是无效的。有什么建议可以更有效/更优雅地做到这一点吗?
9条答案
按热度按时间prdp8dxp1#
如果你需要从0开始,你应该用途:
range函数的参数
stop
只是一个整数,所以你可以使用值len(list) - 1
而不是len(list)
来停止对倒数第二个元素的迭代。dhxwm5r42#
您可以使用
range
的功能如下:这样,你就不会超出列表。
r9f1avp53#
其他答案已经解决了这个问题,但我认为值得一提的是一种可能更接近惯用Python的方法。Python提供了可迭代的解包和其他工具,如
zip
函数,以避免通过索引访问序列的元素。more-itertools包也有一个有用的函数,称为pairwise。
edqdpe6u4#
从一开始向后看
cs7cruho5#
这个管用!
lfapxunr6#
所以鉴于这种情况
if i == len(list)-1:
当索引为7(不是您想要的索引)时,此条件将为True将其更改为
if i == len(list)-2:
2hh7jdfx7#
有很多方法可以做到这一点。最常见的一种是使用zip将每个项目与其后续项目配对:
itertools的
groupby
也是一个流行的选择(但不是最佳选择):for循环只需要跟踪前一个值(不需要索引):
当并行遍历数据时,迭代器可能很有趣(这里是元素和它们的前任):
qaxu7uf28#
csbfibhn9#
如果你在列表中只使用数字,你可能想使用
numpy
,例如:目前还不清楚你的具体用途,但例如在我的代码中,你会得到:
其中,有哪些是属于自己的呢?=元素[i+1]