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
7 réponses
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.
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)
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 ...
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
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]
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?
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