Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 14-11-2020 16:40:57

brics
Invité

liste de liste (python)

bonjour,
j'ai une liste donné
a=[['4'], ['5'], ['3', '1', '25'], ['1', '0', '12'], ['2', '0', '-5'], ['0', '1', '0'], ['2', '1', '7'], []]
je voudrais changer les elements de cette liste qui sont de types str en int comment je doit m'y prendre?

#2 14-11-2020 18:56:05

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

Re : liste de liste (python)

Salut,

Une façon très simple, mais sûrement pas optimisée parce que c'est la première idée qui m'est venue à l'esprit...
Tu as une listes de listes ce qui complique (légèrement) la situation.
Je vais déclarer deux sous-listes bides une nommée b qui remplacera a et ne contiendra que des int, une deuxième nommée c qui servira à traiter les sous-listes.
Comme ces sous-listes sont de longueurs inégales, je ne vais pas m'ennuyer à chercher la longueur de chacune  : je vais laisser Python se débrouiller tout seul en lui demandant dans une première boucle de parcourir a du début à la fin en chargeant chaque sous-liste, une deuxième boucle se chargeant elle de parcourir les éléments (quand il y en a) de chacune en transformant chaque str en int, puis en le stockant dans la sous-liste provisoire c.
En sortie de la deuxième bopucle, je stocke la sous liste c dans b puis je la vide et la 1ere boucle démarre une nouvelle itération (s'il y a lieu).
A la fin j'affiche la liste a, puis en dessous, la liste b pour vérification...

a=[['4'], ['5'], ['3', '1', '25'], ['1', '0', '12'], ['2', '0', '-5'], ['0', '1', '0'], ['2', '1', '7'], []]
b,c=[],[]

for sous_liste in a:
    for element in sous_liste:
        c.append(int(element))
    b.append(c)
    c=[]

print(a)
print(b)

Sortie :

[['4'], ['5'], ['3', '1', '25'], ['1', '0', '12'], ['2', '0', '-5'], ['0', '1', '0'], ['2', '1', '7'], []]
[[4], [5], [3, 1, 25], [1, 0, 12], [2, 0, -5], [0, 1, 0], [2, 1, 7], []]

Petit défaut : je mobile trop de ressources

Ça marche, donc, maintenant, je vais chercher à faire mieux, plus court, et pas forcément plus simple...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#3 14-11-2020 20:11:09

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

Re : liste de liste (python)

Re,

J'ai trouvé...

a=[['4'], ['5'], ['3', '1', '25'], ['1', '0', '12'], ['2', '0', '-5'], ['0', '1', '0'], ['2', '1', '7'], []]
b=[[int(element)for element in sous_liste] for sous_liste in a ]

print(a)
print(b)

Je passe par ce que Python appelle les list comprehension : les définitions, constructions de listes en compréhension : ça tient maintenant en une ligne que j'explique.
b=[                                                                                   ]
traduction : b est la liste des ....
Des quoi ?
... des listes de chaque élément  convertis en int de la liste nommée sous_liste :
b=[ [int(element)for element in sous_liste]                          ]
Et elle vient d'où cette sous_liste ?
Chaque sous_liste est extraite de la liste a : for sous_liste in a
Ce qui donne finalement
b=[[int(element) for element in sous_liste] for sous_liste in a ]

b est donc la liste[ de [chaque liste de int(element) chacun étant pris dans la liste nommée sous_liste], chacune étant prise de la liste a]

C'est plus court je n'ai plus besoin d'utiliser la liste c en la remplissant, la stockant dans b, et la vidant ensuite.
La liste c   est là : [int(element)for element in sous_liste] je n'ai pas besoin de son nom ni de la vider, c'est implicite, et b est l'ensemble des listes sans nom (qui remplacent la liste c)
Et on obtient toutes les listes sans nom en parcurant toutes les listes de a...

Est-ce que c'est assez clair ?
Parce que les list compréhension c'est très élégant, très ramassé mais pas évident à comprendre au début.

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#4 14-11-2020 20:17:00

brics
Invité

Re : liste de liste (python)

Bonsoir Yoshi,
merci pour votre aide ça fera un + à mes possibilités de le faire.
il y'a aussi

raw=[['3', '1', '25'], ['1', '0', '12'], ['2', '0', '-5'], ['0', '1', '0'], ['2', '1', '7'], []]
b=[list(map(int, elem)) for elem in raw]
print(b)

#5 14-11-2020 20:59:04

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

Re : liste de liste (python)

Bonsoir,

C'est joli !
Mais si toi, tu sais faire des choses comme ça (d'ailleurs, c'est aussi une liste comprehension), qu'est-ce que tu viens demander de l'aide ???
Sauf si tu es allé aussi poser ta question sur un autre site.
Je vais chercher parce que ta méthode est encore bien moins évidente que ma solution de double list compréhension...
Si je trouve, je leur signale et paf demande multi-site --> sanction (c'est spécifiquement interdit).
Ici, c'est fortement désapprouvé de manger à plusieurs râteloersvé avec en général, si récidive, bannissement à la clé.
Ainsi celui qui aura essayé de manger à plusieurs râteliers aura tout gagné...
Comme au Loto : 100 % des perdants ont tenté leur chance.

Peut-être que je me fais des idées ? Je ne vais pas tarder à savoir.

@+

[EDIT]Trop tôt pour être référencé d'un côté ou de l'autre...
RAS. je réessaie demain

Dernière modification par yoshi (14-11-2020 21:02:21)


Arx Tarpeia Capitoli proxima...

Hors ligne

#6 15-11-2020 16:39:38

Brics
Invité

Re : liste de liste (python)

Bonsoir,
J'ai pas trop compris ? Vous vous demandez pourquoi j'ai trouvé une solution ?

#7 15-11-2020 17:52:37

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

Re : liste de liste (python)

Re,

Tu te méprends.
J'essayais de comprendre pourquoi tu es venu demander de l'aide alors que tu as été capable de trouver cette méthode !
Et quelle méthode !!! Parce que j'estime que quelqu'un capable de trouver seul (?) une solution de ce niveau n'a pas besoin de moi ou de qui que ce soit sur un forum : je répète qu'elle témoigne d'un très haut niveau, si tu as trouvé ça tout seul alors je n'ai rien à t'apprendre, chapeau bas !...

Je me suis donc demandé si tu n'avais pas, comme certains le font,  posé ta question en même temps sur un autre forum (-d'où tu aurais obtenu cette réponse) et ce genre de procédé (crossposting) quand il est découvert n'est pas pardonné...
En général, je trouve.
Mais là, rien... Google ignore totalement ce sujet, et n'indique même pas qu'il a été posé sur BibMath.

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#8 15-11-2020 23:10:34

brics
Invité

Re : liste de liste (python)

Re,
vous vous méprenez aussi.
J'ai demandé de l'aide sur ce forum certes mais au cas où je n'aurais pas eu de réponse j'ai voulu continuer mes recherches, cela m'a emmener à la fonction map que je ne conaissait pas du tout ,  je pense que elle est plus évidente après c'est peut être une question de point de vue. désolé si je vous ai dérangé mais j'ai pas tout le temps de l'aide sur ce forum ducoup j'ai voulu continuer à chercher des solutions.

#9 16-11-2020 08:06:39

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

Re : liste de liste (python)

Bonjour,

Alors, c'est la bonne attitude, aux antipodes de la mentalité d'assisté qu'on rencontre régulièrement...
Map, filter, reduce forment un triptyque difficile à appréhender et qui ne sont pas d'un emploi très évident, loin de là...
Je suis d'ailleurs en train de m'acharner à trouver une façon de le faire avec filter mais pour le moment c'est négatif. J'ai l'impression que ce n'est pas adapté. Il faudrait passer passer par une fonction additionnelle,  ou une fonction lambda. Et, dans tous les cas, ce sera plus long que map...
Quant à ne pas ne pas avoir de réponse, ça peut arriver, c'est déjà arrivé, ça arrive encore mais la probabilité est faible.

Pour Python, je ne crois pas avoir laissé un seul appel à l'aide de côté. Et si je ne savais répondre, je renverrais le demandeur vers un site spécialisé où les gars qui répondent sont des pointures, mais qui souvent je trouve, manquent d'empathie...

Un conseil : la prochaine fois, précise qu'après recherches tu as trouvé une solution et tu auras des félicitations.

Donc, ce qui figurait en filigrane dans mes posts passe en clair : un grand bravo pour ta pugnacité, ta persévérance et ta réussite !!!

@+
[EDIT]
Désolé d'avoir été si méfiant : j'ai trop vu de petits malins (et petites malignes) s'inscrivant sur deux sites et alternativement se servant des indications/remarques obtenues sur l'un pour aller à la pêche sur l'autre en les présentant comme : j'ai trouvé ceci...
Ça n'était pas ton cas et je m'en réjouis pour toi : c'est un gage de réussite !

Méthode avec fonction lambda.

a=[['4'], ['5'], ['3', '1', '25'], ['1', '0', '12'], ['2', '0', '-5'], ['0', '1', '0'], ['2', '1', '7'], []]
chtp=lambda sous_liste: [[int(element) for element in sous_liste] for sous_liste in a]
print(chtp(a))

Plus long que ma précédente méthode : cette fonction lambda n'apporte rien....
Sauf qu'elle peut être définie une seule fois, et être appelée en divers points d'un prpgramme


Arx Tarpeia Capitoli proxima...

Hors ligne

Pied de page des forums