Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

tri selon plusieurs colonnes

4 réponses
Avatar
Loic Berthe
J'ai un fichier contenant un nombre important de lignes du type :
N,num,r,theta,z
que je voudrais transformer de manière par z croissant puis par theta
croissant,

ainsi
N, 1 , 23 , 45 , 10
N, 2 , 23 , 90 , 20
N, 3 , 23 , 135 , 10
N, 4 , 24 , 180 , 20
N, 5 , 24 , 45 , 10
N, 6 , 24 , 90 , 20
N, 7 , 26 , 135 , 10
N, 8 , 26 , 180 , 20

deviendrait :
N, 1 , 23 , 45 , 10
N, 3 , 23 , 90 , 10
N, 5 , 24 , 135 , 10
N, 7 , 26 , 180 , 10
N, 2 , 23 , 45 , 20
N, 4 , 24 , 90 , 20
N, 6 , 24 , 135 , 20
N, 8 , 26 , 180 , 20

Quelle est la façon la plus efficace de faire ça en python ?

Question subsidiaire :
Quelle est la façon la plus efficace de faire ça si les seuls outils à
disposition sont les commandes shell classiques ?

Loic

4 réponses

Avatar
Christophe Cavalaria
Loic Berthe wrote:

J'ai un fichier contenant un nombre important de lignes du type :
N,num,r,theta,z
que je voudrais transformer de manière par z croissant puis par theta
croissant,

ainsi
N, 1 , 23 , 45 , 10
N, 2 , 23 , 90 , 20
N, 3 , 23 , 135 , 10
N, 4 , 24 , 180 , 20
N, 5 , 24 , 45 , 10
N, 6 , 24 , 90 , 20
N, 7 , 26 , 135 , 10
N, 8 , 26 , 180 , 20

deviendrait :
N, 1 , 23 , 45 , 10
N, 3 , 23 , 90 , 10
N, 5 , 24 , 135 , 10
N, 7 , 26 , 180 , 10
N, 2 , 23 , 45 , 20
N, 4 , 24 , 90 , 20
N, 6 , 24 , 135 , 20
N, 8 , 26 , 180 , 20

Quelle est la façon la plus efficace de faire ça en python ?

Question subsidiaire :
Quelle est la façon la plus efficace de faire ça si les seuls outils à
disposition sont les commandes shell classiques ?

Loic


Tu veux qu'on fasse ton devoir à ta place ? Combien tu propose pour ça ? :)

Avatar
Eric Deveaud
Loic Berthe wrote:
J'ai un fichier contenant un nombre important de lignes du type :
N,num,r,theta,z
que je voudrais transformer de manière par z croissant puis par theta
croissant,

Quelle est la façon la plus efficace de faire ça en python ?


en allant regarder du côté de la fonction sort() et en remarquat qu'elle
prend en argument une fonction de tri.
donc en écrivant cette fondtion de tri ;-)

Question subsidiaire :
Quelle est la façon la plus efficace de faire ça si les seuls outils à
disposition sont les commandes shell classiques ?


man sort, man awk.

Eric

--
Je souhaiterais essayer Internet Explorer 4.0 sous Linux.
Il existe 2 versions: une sous HP/UX et une sous Solaris
Laquelle dois je utiliser?
-+- MJM in Guide du linuxien pervers : "Choisir son environnement" -+-


Avatar
tiissa
Loic Berthe wrote:
J'ai un fichier contenant un nombre important de lignes du type :
N,num,r,theta,z
que je voudrais transformer de manière par z croissant puis par theta
croissant,

ainsi
N, 1 , 23 , 45 , 10
N, 2 , 23 , 90 , 20
N, 3 , 23 , 135 , 10
N, 4 , 24 , 180 , 20
N, 5 , 24 , 45 , 10
N, 6 , 24 , 90 , 20
N, 7 , 26 , 135 , 10
N, 8 , 26 , 180 , 20

deviendrait :
N, 1 , 23 , 45 , 10
N, 3 , 23 , 90 , 10
N, 5 , 24 , 135 , 10
N, 7 , 26 , 180 , 10
N, 2 , 23 , 45 , 20
N, 4 , 24 , 90 , 20
N, 6 , 24 , 135 , 20
N, 8 , 26 , 180 , 20


Vos valeurs de theta ont changé.
Je peux proposer ça :

#### sortcsv.py
ll=open('db.csv').readlines()
print ''.join(ll)
ll=[map(int,l.split()[-1:-4:-2])+[l] for l in ll]
ll.sort()
print ''.join([l[-1] for l in ll])
####


Qui donne :

$ python sortcsv.py
N, 1 , 23 , 45 , 10
N, 2 , 23 , 90 , 20
N, 3 , 23 , 135 , 10
N, 4 , 24 , 180 , 20
N, 5 , 24 , 45 , 10
N, 6 , 24 , 90 , 20
N, 7 , 26 , 135 , 10
N, 8 , 26 , 180 , 20

N, 1 , 23 , 45 , 10
N, 5 , 24 , 45 , 10
N, 3 , 23 , 135 , 10
N, 7 , 26 , 135 , 10
N, 2 , 23 , 90 , 20
N, 6 , 24 , 90 , 20
N, 4 , 24 , 180 , 20
N, 8 , 26 , 180 , 20

$


Quelle est la façon la plus efficace de faire ça en python ?


Je ne sais si c'est la plus efficace, mais elle ne change pas les
valeurs. ;)
De plus, j'ai cru comprendre qu'il valait parfois mieux d'un point de
vue des performances décorer ses infos et les trier avec .sort() ou
sorted que d'utiliser une fonction decomparaison.
D'autres idées dans le howto [1].

Pour les outils du shell, il doit y avoir des groupes de discussion plus
appropriés.

[1]http://www.amk.ca/python/howto/sorting/sorting.html

Avatar
Amaury Forgeot d'Arc
De plus, j'ai cru comprendre qu'il valait parfois mieux d'un point de
vue des performances décorer ses infos et les trier avec .sort() ou
sorted que d'utiliser une fonction decomparaison.


Depuis la version 2.4, il y a le paramètre 'key', qui peut remplacer la
technique de décoration.
C'est en pricipe plus rapide que d'utiliser une fonction de comparaison,
car la fonction de key n'est appelée qu'une seule fois par élément.
Et on n'a pas besoin de construire une autre liste.

On peut ainsi modifier la solution précédente comme ceci:

ll=open('db.csv').readlines()
ll.sort(key=lambda l: map(int,l.split()[-1:-4:-2]) )
print ''.join(ll)

Amaury