python编程...基于条件逻辑测试重新编码列表中的每个元素

问题描述 投票:0回答:4

我有一个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)

任何帮助,将不胜感激。

python list
4个回答
0
投票

这样做的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 documentationzip配方。

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)

0
投票

你可以使用列表理解:

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]

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存储在列表中即可。

那有意义吗?


0
投票

也许对初学者来说,理解一个简单的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]
© www.soinside.com 2019 - 2024. All rights reserved.