您可以根据以下条件在列表推导中保留一个元素:
>>> 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]
我认为枚举和索引可能实现了这一点,但无法解决。有什么想法吗?
答案 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)
enumerate
和index
是一种方法,但是您可以使用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)