检查列表理解中的下一个元素

时间:2018-11-28 17:08:49

标签: python python-3.x list-comprehension

您可以根据以下条件在列表推导中保留一个元素:

>>> mylist = [6,7,3,9,2,7,4]
>>> [x-1 if x!=7 else x for x in mylist]
[5, 7, 2, 8, 1, 7, 3]

不过,我需要的是,如果元素后面的元素为7,则该元素将被保留。

[x-1 if next_element!=7 else x for x in mylist]

所需的输出是:

[6,6,2,8,2,6,3]

我认为枚举和索引可能实现了这一点,但无法解决。有什么想法吗?

4 个答案:

答案 0 :(得分:3)

您可以这样做:

mylist = [6, 7, 3, 9, 2, 7, 4]

result = [current - 1 if ne != 7 else current for current, ne in zip(mylist, mylist[1:])] + [mylist[-1] - 1]
print(result)

输出

[6, 6, 2, 8, 2, 6, 3]

答案 1 :(得分:3)

enumerateindex是一种方法,但是您可以使用zip来做到这一点:

mylist = [6,7,3,9,2,7,4]
[x[0]-(x[1]!=7) for x in zip(mylist, mylist[1:] + [0])]

# [6, 6, 2, 8, 2, 6, 3]

答案 2 :(得分:1)

当阅读变得过于复杂时,不喜欢使用单行代码,但是可以使用,并且列表仅解析一次:

mylist = [6,7,3,9,2,7,4]
L = len(mylist)
a = [x-1 if (i+1<N and mylist[i+1]!=7 or i==N-1) else x for i, x in enumerate(mylist)]

如果您使用大型列表并希望提高性能,则可以在列表理解之外执行L = len(mylist)并将其替换为条件。

答案 3 :(得分:1)

很抱歉,如果这样做不能直接回答您的问题,但是我发现列表理解应在简单的情况下使用,并避免在语句变得过于复杂时使用。有关更多详细信息,请参见Google styleguide

我发现以下内容更具可读性。

mylist = [6,7,3,9,2,7,4]
newlist = []
length = len(mylist)
for index, item in enumerate(mylist):
  if index + 1 < length and mylist[index + 1] == 7:
    newlist.append(item)
  else:
    newlist.append(item - 1)