将元素排列在已排序的列表中,以便所有冗余元素都位于列表的左侧/右侧 - python

有没有比这个更好的方法来解决这个问题了?
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