python 比较列表的所有元素

0s7z1bwu  于 2023-06-04  发布在  Python
关注(0)|答案(9)|浏览(530)

为了说明我的问题,假设我有一个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

但这是无效的。有什么建议可以更有效/更优雅地做到这一点吗?

prdp8dxp

prdp8dxp1#

如果你需要从0开始,你应该用途:

for i in range(len(list) - 1):
    if list[i] == list[i + 1]:
        print('Repeated')

range函数的参数stop只是一个整数,所以你可以使用值len(list) - 1而不是len(list)来停止对倒数第二个元素的迭代。

dhxwm5r4

dhxwm5r42#

您可以使用range的功能如下:

for i in range(1, len(list)):
    if list[i-1] == list[i]:
        print('Repeated')

这样,你就不会超出列表。

r9f1avp5

r9f1avp53#

其他答案已经解决了这个问题,但我认为值得一提的是一种可能更接近惯用Python的方法。Python提供了可迭代的解包和其他工具,如zip函数,以避免通过索引访问序列的元素。

# Better to avoid shadowing the build-in name `list`
a_list = [1, 2, 1, 1, 5, 6, 1, 1]

for value, following_value in zip(a_list, a_list[1:]):
    if value == following_value:
       print("Repeated!")

more-itertools包也有一个有用的函数,称为pairwise。

edqdpe6u

edqdpe6u4#

从一开始向后看

for i in range(1, len(list)): 
    if list[i-1] == list[i]:
        print('Repeated')
cs7cruho

cs7cruho5#

这个管用!

list = [1, 2, 1, 1, 5, 6, 1, 1]

for i in range(len(list)):    
    if i+1 < len(list) and list[i] == list[i+1]:
        print('Repeated')
lfapxunr

lfapxunr6#

  • len(list)为8
  • range(len(list))是0,1,...,7,但是你希望for循环在索引为6时跳过,对吗?

所以鉴于这种情况if i == len(list)-1:当索引为7(不是您想要的索引)时,此条件将为True
将其更改为if i == len(list)-2:

2hh7jdfx

2hh7jdfx7#

有很多方法可以做到这一点。最常见的一种是使用zip将每个项目与其后续项目配对:

if any(item == successor for item,successor in zip(lst,lst[1:])):
    print('repeated')

itertools的groupby也是一个流行的选择(但不是最佳选择):

if any(duplicate for _,(_,*duplicate) in itertools.groupby(lst)):
    print('repeated')

for循环只需要跟踪前一个值(不需要索引):

prev = object() # non-matching initial value
for x in lst:
    if prev==x:              # compare to previous
       print('repeated')
       break
    prev = x                 # track previous for next iteration

当并行遍历数据时,迭代器可能很有趣(这里是元素和它们的前任):

predecessor = iter(lst)         # iterate over items from first
for x in lst[1:]:               # iterate from 2nd item
    if x == next(predecessor):  # compare to corresponding predecessor
        print('repeated')
        break
qaxu7uf2

qaxu7uf28#

list = [1, 2, 1, 1, 5, 6, 1,1]

for i in range(len(list)):
    if list[i] in list[i+1:i+2]:
        print('repeated')
csbfibhn

csbfibhn9#

如果你在列表中只使用数字,你可能想使用numpy,例如:

import numpy as np
np_arr = np.array(lst)  # don't use 'list' for your object name. 
diffs = np.diff(np_arr)
diffs_indices = np.where(diffs != 0)[0]

目前还不清楚你的具体用途,但例如在我的代码中,你会得到:

>>> diffs_indexes
array([0, 1, 3, 4, 5])

其中,有哪些是属于自己的呢?=元素[i+1]

相关问题