J'ai donc cette liste:
lis=[7, 31, 31, 61, 61, 79, 29, 79, 29, 103, 37, 103, 37, 47, 47, 53, 53, 89, 5, 89, 5, 13, 13, 83, 83, 101, 53, 101, 17, 53, 11, 17, 11, 59, 17, 59, 17, 41, 41, 79, 79, 97, 3, 97, 3, 41, 19, 41, 19, 53, 53, 67, 29, 67, 29, 73, 23, 73, 23, 43, 43, 71]
for i in range(0, len(lis)-4,4):
if lis[i]==lis[i+2]:
p=lis[i]
lis[i]=lis[i+1]
lis[i+1]=p
elif lis[i]==lis[i+3]:
p = lis[i]
lis[i] = lis[i + 1]
lis[i + 1] = p
p=lis[i+2]
lis[i+2]=lis[i+3]
lis[i+3]=p
elif lis[i+1]==lis[i+3]:
p=lis[i+2]
lis[i+2]=lis[i+3]
lis[i+3]=p
print(lis)
Et j'aimerais savoir s'il y avait un moyen de les ordonner tel que le dernier élément d'une paire est le premier de la deuxième paire, comme ceci:
[7, 31, 31, 61, 61, 79, 79, 29, 29, 103, 103, 37 ....] [pair1] [pair2] [pair3] [pair4] [pair5] [pair6] ...
Y a-t-il un moyen de faire cela?
J'ai essayé des boucles for mais cela a juste une complexité temporelle très élevée.
voici mon code:
[7, 31, 31, 61, 61, 79, 29, 79, 29, 103, 37, 103, 37, 47, 47, 53, 53, 89, 5, 89, 5, 13, 13, 83, 83, 101, 53, 101, 17, 53, 11, 17, 11, 59, 17, 59, 17, 41, 41, 79, 79, 97, 3, 97, 3, 41, 19, 41, 19, 53, 53, 67, 29, 67, 29, 73, 23, 73, 23, 43, 43, 71]
4 Réponses :
Vous pouvez le faire, comme le tri en fonction de l ' index dans la liste d'origine,
>>> data = [] >>> for k in sorted(x, key=x.index): # `using direct x.index instead of useless lambda(i previously used) in this case, as @Austin suggested ... if data.count(k) < 2: # add the element until it reaches count 2, which is `pair`, which is what you asked for ... data.append(k) ... >>> data [7, 31, 31, 61, 61, 79, 79, 29, 29, 103, 103, 37, 37, 47, 47, 53, 53, 89, 89, 5, 5, 13, 13, 83, 83, 101, 101, 17, 17, 11, 11, 59, 59, 41, 41, 97, 97, 3, 3, 19, 19, 67, 67, 73, 73, 23, 23, 43, 43, 71]
Si vous aimez vraiment une paire alors,
>>> x [7, 31, 31, 61, 61, 79, 29, 79, 29, 103, 37, 103, 37, 47, 47, 53, 53, 89, 5, 89, 5, 13, 13, 83, 83, 101, 53, 101, 17, 53, 11, 17, 11, 59, 17, 59, 17, 41, 41, 79, 79, 97, 3, 97, 3, 41, 19, 41, 19, 53, 53, 67, 29, 67, 29, 73, 23, 73, 23, 43, 43, 71] # the `sorted` function takes a `key` function, that one can use to manipulate how the sort should be based on # In this case, you could use `index` of the `element` in the `list` `x`, # So, while the sort goes through each element, it check against the index in the original list, which is `x, thus it aligns each item based on the `index`. >>> sorted(x, key=x.index) # note that you have more than a pair, so :) [7, 31, 31, 61, 61, 79, 79, 79, 79, 29, 29, 29, 29, 103, 103, 37, 37, 47, 47, 53, 53, 53, 53, 53, 53, 89, 89, 5, 5, 13, 13, 83, 83, 101, 101, 17, 17, 17, 17, 11, 11, 59, 59, 41, 41, 41, 41, 97, 97, 3, 3, 19, 19, 67, 67, 73, 73, 23, 23, 43, 43, 71]
Raisonnement:
list.indexvaretournerle premierindexcorrespondant. Supposons que vous ayez uneliste,x = [1,2,1,3]etx.index (1)sera toujoursretourne0. Ainsi il seratriédifféremment si on utiliselist.indexcomme keyfunc pour lesorting
Plus court:. trié (x, clé = x.index) .
@Austin Mis à jour selon la suggestion. Merci. Les lambda sont mes keyfunc goto , de nos jours :). Pardon
Pourriez-vous développer votre réponse pour expliquer comment cela fonctionne?
@LightnessRacesinOrbit Mis à jour. Dois-je en ajouter plus? s'il vous plaît, faites-moi savoir
Désolé mais votre ajout n'a vraiment rien clarifié. Pourquoi le tri par index d'origine fonctionne-t-il? Le tri basé sur l'index d'origine ne vous redonnerait-il pas simplement, eh bien, la même liste? Je veux dire clairement que non, mais je ne comprends pas pourquoi et votre réponse ne l'explique pas.
@LightnessRacesinOrbit Il ne restituera pas la même liste , car list.index renverra le premier index correspondant . Supposons que vous ayez une liste x = [1,2,1,3] et x.index (1) renverra toujours 0 . Ainsi il sera trié différemment si l'on utilise list.index comme fonction key pour le sort ing
Ah, donc x.index (y) vous donne la position du premier élément correspondant à y à l'intérieur de x ? D'accord, cela a du sens.
Il semble que vous vouliez transposer les deuxième et troisième éléments si le premier et le troisième sont égaux. Vous feriez quelque chose comme:
i = 0
while i < len(seq) - 2:
if seq[i] == seq[i + 2]:
# Swap the next two elements
seq[i + 1], seq[i + 2] = seq[i + 2], seq[i + 1]
i = i + 3
continue
i = i + 1
J'allais dire que ce n'est même pas un Python valide (à cause de ++ i ) mais ensuite j'ai réalisé que ++ i est, en fait, un Python valide . Cela ne fait tout simplement pas ce que l'on pourrait penser. :)
C'est une solution assez bâclée, mais elle devrait faire votre travail.
Tout d'abord, nous découpons vos données en paires de deux, puis nous trierons ces deux paires.
data = [7, 31, 31, 61, 61, 79, 29, 79, 29, 103, 37, 103, 37, 47, 47, 53, 53, 89, 5, 89, 5, 13, 13, 83, 83, 101, 53, 101, 17, 53, 11, 17, 11, 59, 17, 59, 17, 41, 41, 79, 79, 97, 3, 97, 3, 41, 19, 41, 19, 53, 53, 67, 29, 67, 29, 73, 23, 73, 23, 43, 43, 71]
def chunks(l, n):
# For item i in a range that is a length of l,
for i in range(0, len(l), n):
# Create an index range for l of n items:
yield l[i:i+n]
sliced_list = list(chunks(data, 2))
ordered_list = []
for a in sliced_list:
# Sort the pairs
ordered_list.append([a[0], a[1]] if a[0] < a[1] else [a[1], a[0]])
print(ordered_list)
Une autre solution merdique
import numpy as np
alist=np.array([7, 31, 31, 61, 61, 79, 29, 79, 29, 103, 37, 103, 37, 47, 47, 53, 53, 89, 5, 89, 5, 13, 13, 83, 83, 101, 53, 101, 17, 53, 11, 17, 11, 59, 17, 59, 17, 41, 41, 79, 79, 97, 3, 97, 3, 41, 19, 41, 19, 53, 53, 67, 29, 67, 29, 73, 23, 73, 23, 43, 43, 71])
l=alist.reshape(-1,2)
for row in range(1,len(l)):
if abs(l[row-1,1]-l[row,1])<=abs(l[row-1,1]-l[row,0]):
l[row]=np.roll(l[row],1)
Veuillez ajouter le code, qu'avez-vous essayé jusqu'à présent.
"le dernier élément d'une paire est le premier de la deuxième paire" hein! Quoi? Pouvez-vous clarifier cela?
Êtes-vous sûr qu'il y a au moins assez de paires?