我有一个python相关的问题。给定一个像这样的列表:mylist=[21,35,38,41,10,9]
我如何编写代码来创建一个新的列表,在mylist的每个元素上执行一些条件逻辑。我想要应用的逻辑是基于这种直觉:
if mylist[i] < mylist[i+1] then 1 else 0
。
所以在这种情况下,重新编码的列表将如下所示:
re_code=[1,1,1,0,0] (yes len(re_code) = len (mylist) - 1)
然后,如果可能的话,我想用0提取元素的索引。所以像这样的列表= index=[4,5]
。我希望我解释这一点的方式是有道理的。
我试过这样的东西,但它不起作用:
for i in mylist:
re_code=[i for i in mylist]
re_code[i]=[1 if mylist[i]< mylist[i +1] else 0]
return(re_code)
任何帮助,将不胜感激。
这样做的pythonic方法是使用zip
和列表推导,这避免使用索引来获得re_code
,然后使用enumerate
来获取index
的索引。
mylist=[21,35,38,41,10,9]
re_code = [int(a < b) for a, b in zip(mylist, mylist[1:])]
index = [i for i, v in enumerate(re_code) if v == 0]
print(re_code)
print(index)
打印出来的是
[1, 1, 1, 0, 0]
[3, 4]
如果你只想要index
的值,并且不需要re_code
,这可以在一个列表理解中完成。问你是否要我展示它。
zip
将列表中的连续项配对。如果列表很长或者它可能是可迭代的而不是列表,那么你应该使用pairwise
而不是itertools documentation的zip
配方。
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return zip(a, b)
你可以使用列表理解:
mylist = [21,35,38,41,10,9]
re_code = [int(mylist[i] < mylist[i+1]) for i in range(len(mylist) - 1)]
print(re_code) # ==> [1, 1, 1, 0, 0]
你的代码几乎只有几点。
使用索引迭代列表可能更容易,而不是一次访问一个元素,如下所示:
for i in range(len(mylist) - 1): # notice we iterate up to the second to last element
然后,您可以使用i
作为循环内的索引来访问列表,例如mylist[i]
。
目前,for i in mylist
将为您提供实际元素而不是其索引。
最后,您可能希望跟踪索引,因此只需将i
存储在列表中即可。
那有意义吗?
也许对初学者来说,理解一个简单的for-loop
可能更容易?
mylist = [21,35,38,41,10,9]
iterlist = iter(mylist[1:]) # create an iterator from your list minus first element
result = []
for i in mylist:
try:
if i < next(iterlist): # compare current val with val in front of it
result.append(1)
else:
result.append(0)
except StopIteration: # if there's nothing left in the iterator end the loop
break
print(result)
[1, 1, 1, 0, 0]