将列表中的每个元素与下一个元素进行比较

时间:2019-07-19 21:32:14

标签: python python-3.x

我有一个整数a的列表,我想遍历它的每个元素,如果该元素小于或等于列表中的下一个元素(即将到来的索引邻居),我想将元素转换为字符串并在其上连接“ 000”。但是,如果它大于下一个元素,我想将“ 111”连接到它上面。

我使用Python 3.7.3。

这是我已经尝试过的:

a = [41433, 23947, 10128, 89128, 29523, 47106]

for I in a:
      if a[I] <= a[I+1]:
             a[I] = str(a[I] + "000")
      else:
             a[I] = str(a[I] + "111")

我实际上已经尝试了很多,但没有任何效果。 当我运行代码时,我总是得到“ IndexError:列表索引超出范围”。

我是Python的新手,有人知道解决方案吗?

5 个答案:

答案 0 :(得分:4)

您的I值不是索引,而是a中的元素(41433、23947等),因此a[41433]不存在。

尝试使用范围

for i in range(0, len(a)-1):
  if a[i] <= a[i+1]:
    a[i] = str(a[i]) + "000"
  else:
    a[i] = str(a[i]) + "111"

答案 1 :(得分:0)

您可以将列表理解与zip一起使用,使用三元数来分配“ 000”或“ 111”。数组已使用其自身的偏移版本进行了压缩,从而可以轻松比较valnext_val

[str(val) + ("000" if val <= next_val else "111")
 for val, next_val in zip(a[:-1], a[1:])]

答案 2 :(得分:0)

一种Python方法是使用enumerate,它返回(index, list[index)的元组。

for idx, val in enumerate(a[:-1]):
    if val <= a[idx+1]:
        a[idx] = str(a[idx]) + "000"
    else:
        a[idx] = str(a[idx]) + "111"

注释
使用a[:-1]循环到倒数第二项,这样就不会遇到索引超出范围的错误。

答案 3 :(得分:0)

我将使用itertools为您的列表创建两个迭代器,并将它们压缩在一起,以便获得成对的连续值:

from itertools import tee

i1, i2 = tee(a)
next(i2, None)    # advances i2 by one step
pairs = zip(i1, i2)
a = [str(elem1)+'000' 
        if elem1 <= elem2 else str(elem1)+'111' 
        for elem1, elem2 in pairs]

答案 4 :(得分:0)

枚举非常适合此用例。还将提高可读性:

a = [41433, 23947, 10128, 89128, 29523, 47106]                  

for index, elem in enumerate(a[:-1]):                           
    if a[index] <= a[index+1]:                                  
        a[index] = str(a[index]) + "000"                     
    else:                                                       
        a[index] = str(a[index]) + "111"                     
print(a) 

['41433111','23947111','10128000','89128111','29523000',47106]