判断列表内容是否从奇数变为偶数的Pythonic方法

18 投票
10 回答
543 浏览
提问于 2025-04-16 16:08

我在写一些测试案例的时候,脑子里想着,可能有更好的方法来写这样的代码。我有一个列表,里面的数字从全是奇数变成全是偶数,中间的具体位置不重要。我需要确认这个情况,下面是我想到的代码:

values = [1, 3, 5, 7, 5, 3, 5, 3, 5, 7, 4, 6, 8, 4, 2, 2, 8, 6]

# find all the indexes of odd and even values
odds = [i for (i, v) in enumerate(values) if v % 2 == 1]
evens = [i for (i, v) in enumerate(values) if v % 2 == 0]

# indexes should be a continuous sequence: 0, 1, 2, 3 ... n
assert odds + evens == range(evens[-1] + 1)

感觉这样写有点繁琐。有没有什么建议可以让它更简洁呢?

10 个回答

5

其实,你不需要去计算 evens

assert odds == range(len(odds))
8

一个可能的解决办法是考虑你只允许

odd->odd
odd->even
even->even

换句话说,唯一不允许的转换是

even->odd

这可以理解为

(0, 1) not in ((x%2, y%2) for x, y in zip(values, values[1:]))
6
[x for x in values if x % 2 == 1] + [x for x in values if x % 2 == 0] == values

这句话的意思是,只有当values这个列表的开头全是奇数,然后后面才是偶数的时候,这个说法才成立。

撰写回答