<p>还有两种方法和基准:</p>
<pre><code># inspired by Grismar
def solve(a):
return [x for x, y in zip(a, [.5] + a) if (x + y) % 2]
</code></pre>
<pre><code>from itertools import groupby
def solve(a):
return [next(g) for _, g in groupby(a, 1 .__and__)]
</code></pre>
<p><code>a = random.choices(range(100), k=10**6)</code>的基准时间:</p>
<pre><code>124 ms 124 ms 128 ms 125 ms 127 ms Grismar1
172 ms 228 ms 291 ms 178 ms 180 ms Grismar2
102 ms 105 ms 106 ms 102 ms 106 ms Grismar3
96 ms 86 ms 89 ms 85 ms 85 ms dont_talk1
162 ms 179 ms 165 ms 166 ms 165 ms dont_talk2
</code></pre>
<p>基准代码(<a href="https://tio.run/##jVTbjtsgEH3nK6aqVgupa8Wxtqoi@bkfYVkWsScJig0WkNbuz6dgfEmyu1J5MTDDOWeYg7vBnpVMf3b6djtq1YLmsnYf0XZKW6jOSlRoyBiyokVh55DGDrkNEWFRW6UaMwdPWl27w0BIjUf4pYVpuU4oZ3sCbogjSGWBh5UfGu1VS8iLccc0EjLIeb4twsZRaehBSOB5si/WYw6ohxfYwZfMH8q/J4VfrgkTWsy7DmVNe0bu2FzgQeBuETjL6UdmGQVylNcWNbfo8uYaJIzSJg08l5OE4gE5fYdcLJcA2BicioVvM2cfweA5/4qOjkVHEEgXruGOplbSlpY3l@STEh7gIsjjN88VEGnvpgP7CO79jUjsLT2xEbSM4ORBp2Z74ATisnQOKkvmsIxqfqM2rpezBaLlrpdZGt3Jv5vvCPkKldIaKyvRGKBGtfjnzG0cx6BkMzh3YnUx0KA82bNhxIsKCy/LOfmEdLedKhgVr/vJvO8HdxInq9M5vGURXLIAx5ZM7Dunx6VPtbmuuf7sizXD84SgJ5vSHh2p0VybFeQJYBRkjHtRvhgakhlk2bgMAhghT/WkUzmfl5JsN5sfjPyHxkp1An3b/LumuZf3fH1v7E6x/zH49PBLoA1vDzXfz9WNlgmQzAlxj@iAOkvW450W0tINfX1Ja2gNvDorUgsbSDANTrOeeGRxAAHW@UzyFp3RyIrBbrd/" rel="nofollow noreferrer" title="Python 3.8 (pre-release) – Try It Online">Try it online!</a>):</p>
<pre><code>from random import choices
from timeit import repeat
from itertools import groupby
def Grismar1(a):
if not a:
return []
sln = [a[0]]
for x in a[1:]:
if x % 2 != sln[-1] % 2:
sln.append(x)
return sln
def Grismar2(a):
return [x for n, x in enumerate(a) if not n or x % 2 != a[n-1] % 2]
def Grismar3(a):
return [] if not a else [a[0]] + [x for x, y in zip(a[1:], a) if x % 2 != y % 2]
def dont_talk1(a):
return [x for x, y in zip(a, [.5] + a) if (x + y) % 2]
def dont_talk2(a):
return [next(g) for _, g in groupby(a, 1 .__and__)]
solvers = Grismar1, Grismar2, Grismar3, dont_talk1, dont_talk2
# correctness (somewhat... only checks lengths)
for length in range(20):
for _ in range(10):
a = choices(range(100), k=length)
expect = solvers[0](a[:])
for solver in solvers:
result = solver(a[:])
assert len(result) == len(expect)
for _ in range(3):
a = choices(range(100), k=10**6)
for solver in solvers:
copies = iter([a[:] for _ in range(5)])
times = repeat(lambda: solver(next(copies)), number=1)
print(*('%3d ms ' % (t * 1e3) for t in times), solver.__name__)
print()
</code></pre>