J'ai une liste de numéros non triés avec pair et impair. J'ai besoin de séparer les nombres pairs et impairs dans un ordre trié.

Par exemple:

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

Production attendue :

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

Mon programme pour séparer les nombres pairs et impairs.

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]

J'essaie de trier la liste en utilisant le tri par insertion, je n'ai pas pu obtenir la bonne sortie. N'importe quel moyen de trier cela facilement

4
Gopi 16 avril 2018 à 10:46

7 réponses

Meilleure réponse

Utilisation d'une fonction de touche "intelligente" pour list.sort / trié:

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

Mappe les nombres pairs à la valeur [0, n] et les nombres impairs à la valeur [1, n], de sorte que les nombres pairs viennent en premier selon l'ordre naturel.

4
fferri 16 avril 2018 à 16:08

Faites une liste des événements et une liste des cotes, puis combinez:

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)

Ou en utilisant filter, lambda:

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
Austin 16 avril 2018 à 08:02

On peut d'abord trier sur n%2 (n modulo 2), qui sera 0 pour les nombres impairs et 1 pour les nombres pairs, puis sur le nombre lui-même:

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]

Les tuples que nous utilisons comme clé sont triés selon leur premier élément d'abord, puis selon leur second.

Et cela fonctionnera également pour les nombres négatifs ...

1
Thierry Lathuille 16 avril 2018 à 08:07

Je suggère ceci si vous voulez éviter d'utiliser des bibliothèques externes:

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
M.H Mighani 16 avril 2018 à 09:33

Utilisez simplement les bases de la compréhension de la liste

>>> 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
ProgSnob 16 avril 2018 à 07:53

Si vous êtes heureux d'utiliser une bibliothèque tierce, vous pouvez utiliser l'indexation booléenne avec numpy.

numpy.lexsort trie de manière inverse, c'est-à-dire qu'il considère A % 2 avant A:

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]

Connexes: Pourquoi NumPy au lieu des listes Python?

0
jpp 16 avril 2018 à 08:25

Une solution simple:

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
Giuseppe Angora 25 mai 2018 à 08:48