首页 文章

在奇数和偶数隔离列表中对奇数和偶数进行排序/分组

提问于
浏览
4

我有一个偶数和奇数的未排序数字列表 . 我需要按排序顺序隔离奇数和偶数 .

例如:

List = [5,6,4,7,11,14,12,1,3]

预期产量:

[4,6,12,14,1,3,5,7,11]

我的程序将奇数和偶数分开 .

L = [5,6,4,7,11,14,12,1,3]
def segregateEvenOdd(L):
    left,right = 0,len(L)-1
    while left < right:
        while (L[left]%2==0 and left < right):
            left += 1
        while (L[right]%2 == 1 and left < right):
            right -= 1
        if (left < right):
            L[left],L[right] = L[right],L[left]
            left += 1
            right = right-1

print segregateEvenOdd(L)

output : [12, 6, 4, 14, 11, 7, 5, 1, 3]

我试图使用插入排序对列表进行排序,无法得到正确的输出 . 任何方式轻松排序

7 回答

  • 3

    只需使用列表理解基础知识

    >>> arr = [5,6,4,7,11,14,12,1,3]
    >>> evens = sorted([e for e in arr if e % 2 ==0])
    >>> odds = sorted([e for e in arr if e % 2 !=0])
    >>> print(evens + odds)
    [4, 6, 12, 14, 1, 3, 5, 7, 11]
    
  • 1

    制作一个均衡列表和赔率列表,然后合并:

    lst = [5,6,4,7,11,14,12,1,3]
    even = sorted([i for i in lst if i%2 == 0])
    odd = sorted([i for i in lst if i%2])
    print(even + odd)
    

    或者使用 filterlambda

    lst = [5,6,4,7,11,14,12,1,3]
    lst.sort()
    
    even = list(filter(lambda x: not x%2, lst))
    odd = list(filter(lambda x: x%2, lst))
    
    print(even + odd)
    
  • 0

    如果你想避免使用外部库,我建议你这样做:

    def even_odd_sort(list):
    evens=[]
    odds=[]
    for i in list:
        if(i%2==0):
            evens.append(i)
        else:
            odds.append(i)
    evens.sort()
    odds.sort()
    return evens+odds
    
  • 0

    简单的解决方案:

    import numpy as np
    l = [5,6,4,7,11,14,12,1,3]
    l_sort = np.sort(l) #sorting elements of the list
    evens = list(filter(lambda x: x%2==0, l_sort)) #extract even elements 
    odds = list(filter(lambda x: x%2!=0, l_sort)) #extract odd elements
    out = evens + odds
    
  • 0

    使用list.sort / sorted的"smart"键功能:

    >>> list(sorted(lst, key=lambda x: [x % 2, x]))
    [4, 6, 12, 14, 1, 3, 5, 7, 11]
    

    将偶数映射到值 [0, n] ,将奇数映射到值 [1, n] ,以便偶数数字按照自然顺序排在第一位 .

  • 0

    如果您乐意使用第三方库,则可以使用 numpy 进行布尔索引 .

    numpy.lexsort以反向方式排序,即它在 A 之前考虑 A % 2

    import numpy as  np
    
    A = np.array([4,6,12,14,1,3,5,7,11])
    
    res = A[np.lexsort((A, A % 2))]
    
    # [ 4  6 12 14  1  3  5  7 11]
    

    相关:Why NumPy instead of Python lists?

  • 0

    我们可以先对 n%2 (n模2)进行排序,对于奇数,它将为0,对于偶数,将为1,然后是数字本身:

    L = [5,6,4,7,11,14,12,1,3]
    out = sorted(L, key = lambda n:(n%2, n))
    
    print(out)
    # [4, 6, 12, 14, 1, 3, 5, 7, 11]
    

    我们用作键的元组首先按照它们的第一个项目排序,然后按照它们的第二个项目排序 .

    它也适用于负数......

相关问题