有没有比这个更好的方法来解决这个问题了?
def渲染(arr):
single_elements = []
double_elements = []
for i in xrange(len(arr)-1):
if arr[i] == arr[i+1] or arr[i] == arr[i-1]:
double_elements.append(arr[i])
else:
single_elements.append(arr[i])
if arr[-1] == double_elements[-1]:
double_elements.append(arr[-1])
else:
single_elements.append(arr[-1])
return single_elements+double_elements
arr = [1,2,3,3,3,4,5,6,7,7,7,7,8,8,8,9]
'''输出arr = [1,2,4,5,6,9,3,3,3,7,7,7,7,8,8,8]'''
打印渲染(arr)
python大神给出的解决方案
您的方法是最有效的,可以使用枚举而不是重复索引进行几次更改来使其效率更高,使用python 2可以减少15%的运行时,使用python 3可以减少25%的运行时:
single_elements = []
double_elements = []
for i, ele in enumerate(arr[:-1], 1):
if ele == arr[i] or ele == arr[i-2]:
double_elements.append(ele)
else:
single_elements.append(ele)
ele = arr[-1]
if ele == double_elements[-1]:
double_elements.append(ele)
else:
single_elements.append(ele)
single_elements.extend(double_elements)
或者,如果您希望减少行数:
sin_ele = []
dbl_ele = []
for i, ele in enumerate(arr[:-1], 1):
dbl_ele.append(ele) if ele == arr[i] or ele == arr[i-2] else sin_ele.append(ele)
ele = arr[-1]
dbl_ele.append(ele) if dbl_ele and ele == dbl_ele[-1] else sin_ele.append(ele)
sin_ele.extend(dbl_ele)
一些计时和覆盖一个元素的数组和一个空数组:
def sort_dups(arr):
if len(arr) < 2:
return arr
sin_ele = []
dbl_ele = []
for i, ele in enumerate(arr[:-1], 1):
dbl_ele.append(ele) if ele == arr[i] or ele == arr[i - 2] else sin_ele.append(ele)
ele = arr[-1]
dbl_ele.append(ele) if dbl_ele and ele == dbl_ele[-1] else sin_ele.append(ele)
sin_ele.extend(dbl_ele)
return sin_ele
In [38]: timeit sort_dups(arr)
100000 loops, best of 3: 4.69 µs per loop
In [39]: timeit f(arr)
100000 loops, best of 3: 8.05 µs per loop
In [40]: %%timeit
repeatedElements = []
[num for (i, num) in enumerate(arr[:-1]) if not
(arr[i] == arr[i+1] or arr[i] == arr[i-1]) or
repeatedElements.append(num)] + repeatedElements ....:
100000 loops, best of 3: 5.38 µs per loop
空元素列表:
In [74]: sort_dups([1, 2, 2, 3, 5, 5, 5])
Out[74]: [1, 3, 2, 2, 5, 5, 5]
In [75]: sort_dups([1, 1, 1, 1, 2])
Out[75]: [2, 1, 1, 1, 1]
In [76]: sort_dups([])
Out[76]: []
In [77]: sort_dups([0])
Out[77]: [0]
在稍大的输入上:
In [59]: arr = [1,2,3,3,3,4,5,6,7,7,7,7,8,8,8,9,12,12,12,14,15,15,15,19,20]
In [60]: timeit f(arr)
100000 loops, best of 3: 14.2 µs per loop
In [61]: timeit sort_dups(arr)
100000 loops, best of 3: 7.81 µs per loop
In [71]: arr+= [None]
In [72]: %%timeit
repeatedElements = []
[num for (i, num) in enumerate(arr[:-1]) if not
(arr[i] == arr[i+1] or arr[i] == arr[i-1]) or
repeatedElements.append(num)] + repeatedElements
....:
100000 loops, best of 3: 10.1 µs per loop
In [93]: %%timeit
a, b = [], []
>>> for i, x in enumerate(arr):
(b if (x in arr[i-1:i+2:2] if i > 0 else x in arr[1:2]) else a).append(x)
....:
10000 loops, best of 3: 14 µs per loop
In [110]: arr = [1,2,3,3,3,4,5,6,7,7,7,7,8,8,8,9,12,12,12,14,15,15,15,19,20]
In [111]: timeit reorderSequence(arr)
100000 loops, best of 3: 7.85 µs per loop
In [112]: timeit sort_dups(arr)
100000 loops, best of 3: 4.78 µs per loop
In [110]: arr = [1,2,3,3,3,4,5,6,7,7,7,7,8,8,8,9,12,12,12,14,15,15,15,19,20]
In [119]: timeit cython_sort_dups(arr)
1000000 loops, best of 3: 1.38 µs per loop