我有一个整数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的新手,有人知道解决方案吗?
答案 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”。数组已使用其自身的偏移版本进行了压缩,从而可以轻松比较val
和next_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]