一個解決方案,讓你徹夜難眠:
>>> example = [None, None, 90, 10, None, 34, None, 108]
>>>
>>> def some(a, *b):
... return ([*some(*b), a] if a is None else [a, *some(*b)]) if b else [a]
...
>>> print(some(*example))
[90, 10, 34, 108, None, None, None, None]
說明
我們通過數據到使用*example
以便列表中的元素成爲爭論我們的函數。然後,我們使用(a, *b)
在函數調用中分段這些參數,將第一個參數放在a
中,其餘的放在b
中。遞歸,如果a
爲None
,那麼答案是:
[*some(*b), a]
其移動a
到底。否則,答案是:
[a, *some(*b)]
它將a
保留在前面並處理列表的其餘部分。
最後,我們有if b else [a]
位,這只是我們遞歸的基本情況。
烘烤關
我們的已經夠多的解決方案,它的時間爲一個烘烤過。 (讓我知道如果我誤解了你的解決方案。)我們將總結10,000個元素列表的十個時間點,其中30%的元素是None
。我從數據中消除零,這樣每個人都可以玩:
import sys
import timeit
import random
A = [random.randint(1, 1000) if random.random() > 0.3 else None for _ in range(10000)] # ~30% None
def Rahul_comprehension(A):
B = [x for x in A if x is not None]
B += [None] * A.count(None)
return B
def coldspeed_filter(A):
B = list(filter(None, A))
B += [None] * (len(A) - len(B))
return B
def user2357112_comprehension(A):
B = [x for x in A if x is not None]
B += [None] * (len(A) - len(B))
return B
sys.setrecursionlimit(100000)
def cdlane_recursion(A):
def some(a, *b):
return ([*some(*b), a] if a is None else [a, *some(*b)]) if b else [a]
return some(*A)
from functools import reduce
def PaulMcG_reduce(A):
return sum(reduce(lambda a,b: a[b is None].append(b) or a, A, ([], [])), [])
from itertools import zip_longest
def PaulMcG_zip_longest(A):
non_nones = filter(lambda x: x is not None, A)
return next(zip(*zip_longest(non_nones, A)))
def Massimiliano_sorted(A):
return sorted(A, key=lambda x: x is None)
# sanity check to make sure everyone agrees on the answer
B = Rahul_comprehension(A) # the accepted answer
assert B == coldspeed_filter(A)
assert B == user2357112_comprehension(A)
assert B == cdlane_recursion(A)
assert B == PaulMcG_reduce(A)
assert B == list(PaulMcG_zip_longest(A))
assert B == Massimiliano_sorted(A)
print("Rahul_comprehension:", format(timeit.timeit('B = Rahul_comprehension(A)', number=10, globals=globals()), ".2"))
print("coldspeed_filter:", format(timeit.timeit('B = coldspeed_filter(A)', number=10, globals=globals()), ".2"))
print("user2357112_comprehension:", format(timeit.timeit('B = user2357112_comprehension(A)', number=10, globals=globals()), ".2"))
print("cdlane_recursion:", format(timeit.timeit('B = cdlane_recursion(A)', number=10, globals=globals()), ".2"))
print("PaulMcG_reduce:", format(timeit.timeit('B = PaulMcG_reduce(A)', number=10, globals=globals()), ".2"))
print("PaulMcG_zip_longest:", format(timeit.timeit('B = PaulMcG_zip_longest(A)', number=10, globals=globals()), ".2"))
print("Massimiliano_sorted:", format(timeit.timeit('B = Massimiliano_sorted(A)', number=10, globals=globals()), ".2"))
排序典型最佳奔跑:(最低是最好的)
coldspeed (filter): 0.002
user2357112 (comprehension): 0.0041
Rahul (comprehension): 0.0061
PaulMcG (zip_longest): 0.024
PaulMcG (reduce): 0.025
Massimiliano (sorted): 0.026
cdlane (recursion): 5.8
@vaultah 1.「如何在Python2中完成」2. 0s,而不是Nones。對不起,但這不是一個騙局。 –
你應該不僅能夠做「將X移動到開頭」到「將Y移動到最後」的翻譯。另外,請不要在沒有其他人的支持的情況下重新打開你的問題。 – poke
@poke它甚至不是相同的Python版本。 –