写一些测试用例和我的思绪徘徊,假设有更好的方法来写这样的东西.我有一个列表,它的数字从所有奇数值转换到所有偶数,无所谓.我需要断言这是事实,这就是我想出的:
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)
似乎还有很长的路要走.关于如何减少这种情况的建议?
一种可能的解决方案是考虑您只允许
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)
[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从它所有的奇数值开始,然后是所有偶数值.
好吧,你不需要计算evens:
assert odds == range(len(odds))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
417 次 |
| 最近记录: |