确定列表内容是否从奇数值变为偶数值的Pythonic方法

Nic*_*eys 18 python list

写一些测试用例和我的思绪徘徊,假设有更好的方法来写这样的东西.我有一个列表,它的数字从所有奇数值转换到所有偶数,无所谓.我需要断言这是事实,这就是我想出的:

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)
Run Code Online (Sandbox Code Playgroud)

似乎还有很长的路要走.关于如何减少这种情况的建议?

650*_*502 8

一种可能的解决方案是考虑您只允许

odd->odd
odd->even
even->even
Run Code Online (Sandbox Code Playgroud)

换句话说,唯一禁止的过渡是

even->odd
Run Code Online (Sandbox Code Playgroud)

这转化为

(0, 1) not in ((x%2, y%2) for x, y in zip(values, values[1:]))
Run Code Online (Sandbox Code Playgroud)

  • 这是事实,所有奇怪的都是可以接受的.由于过渡可能发生在任何地方,这可能永远不会发生.创意点.:) (2认同)

Ish*_*tar 6

[x for x in values if x % 2 == 1] + [x for x in values if x % 2 == 0] == values
Run Code Online (Sandbox Code Playgroud)

这只是真的,如果values从它所有的奇数值开始,然后是所有偶数值.


dfa*_*fan 5

好吧,你不需要计算evens:

assert odds == range(len(odds))
Run Code Online (Sandbox Code Playgroud)

  • 甚至`断言赔率[-1] == len(赔率)-1`如果你不想比较整个列表. (2认同)