[Python] défaire une séquence de séquences
Bob El Ahn
Messages postés
42
Statut
Contributeur
-
Bob El Ahn Messages postés 42 Statut Contributeur -
Bob El Ahn Messages postés 42 Statut Contributeur -
Chers ccmistes,
Voilà une fonction que je livre au cas où elle peut aider. En fait, je ne me souviens plus pourquoi je l'ai écrite mais ça a mis du temps! J'ai un fichier avec plus d'une dizaine de variations qui ne fonctionnent pas..
Listit() prend une séquence en argument et retourne une liste avec tous les éléments de la séquence dans l'ordre. Si la séquence comportait des 'nested sequences' listit les sort.
Voilà j'espère que ça peut être utile. J'ai pas testé extensivement donc si vous trouvez des exceptions: postez.
Sinon si vous connaissez mieux pour obtenir ce résultat, un truc qui pythonne grave quoi, faites m'en part!
On doit pouvoir ajouter un comportement pour les dictionnaires.
Autrement : if type(seq[0]) == type(()) or type([]): faisait en général tout planter. Euh, pourquoi?
Mir,
Voilà une fonction que je livre au cas où elle peut aider. En fait, je ne me souviens plus pourquoi je l'ai écrite mais ça a mis du temps! J'ai un fichier avec plus d'une dizaine de variations qui ne fonctionnent pas..
Listit() prend une séquence en argument et retourne une liste avec tous les éléments de la séquence dans l'ordre. Si la séquence comportait des 'nested sequences' listit les sort.
def listit(seq):
"""Takes a nested seqence and returns a flat list."""
flatlist=[]
if seq:
if type(seq[0]) == type([]):
flatlist = listit(seq[0]) + listit(seq[1:])
elif type(seq[0]) == type(()):
flatlist = listit(seq[0]) + listit(seq[1:])
else:
flatlist = [seq[0]] + listit(seq[1:])
return flatlist
exemple:
>>> l = [('a', 2), ('b', 5), ('t', 6), [1, 2, 'r', 89, 'hi'], (98, 23, ('i', 7))]
>>> listit(l)
>>> ['a', 2, 'b', 5, 't', 6, 1, 2, 'r', 89, 'hi', 98, 23, 'i', 7]
Voilà j'espère que ça peut être utile. J'ai pas testé extensivement donc si vous trouvez des exceptions: postez.
Sinon si vous connaissez mieux pour obtenir ce résultat, un truc qui pythonne grave quoi, faites m'en part!
On doit pouvoir ajouter un comportement pour les dictionnaires.
Autrement : if type(seq[0]) == type(()) or type([]): faisait en général tout planter. Euh, pourquoi?
Mir,
A voir également:
- [Python] défaire une séquence de séquences
- Couper des séquences dans une vidéo - Guide
- Citizen code python avis - Accueil - Outils
- Python est introuvable. exúcutez sans argument pour procúder ó l - Forum Python
- Mot secret python pix ✓ - Forum Python
- Error 1962 no operating system found. boot sequence will automatically repeat ✓ - Forum logiciel systeme
7 réponses
Tiens, en survolant le tutoriel de Guido je pense que je vais faire un tour du côté du module 'array'..
Mir,
Mir,
Tiens j'ai pensé à une autre méthode, pas très clean j'admet..
Certes, c'est un peu jouer sur les mots mais..
J'ai essayé de faire ça avec expressions régulières mais faut que je révise parce que ca le faisait pas.
D'ailleurs doit surement y avoir plus efficace même avec les 'string methods'. M'enfin je trouve que ca pythonne un peu, un tout petit peu.. ;)
Mir,
def listit(seq):
flatlist = str(seq)
flatlist = flatlist.replace("[",'')
flatlist = flatlist.replace("]", '')
flatlist = flatlist.replace("(",'')
flatlist = flatlist.replace(")", '')
flatlist = "[%s]" % flatlist
return eval(flatlist)
Certes, c'est un peu jouer sur les mots mais..
J'ai essayé de faire ça avec expressions régulières mais faut que je révise parce que ca le faisait pas.
D'ailleurs doit surement y avoir plus efficace même avec les 'string methods'. M'enfin je trouve que ca pythonne un peu, un tout petit peu.. ;)
Mir,
Vive Google Code Search ;-)
(Trouvé là)
l = [('a', 2), ('b', 5), ('t', 6), [1, 2, 'r', (897,777,888), 'hi'], (98, 23, ('i', 7))]
import types
def _flatten(L,a):
for x in L:
if type(x) in (types.ListType,types.TupleType): _flatten(x,a)
else: a(x)
def flatten(L):
'''recursively flatten the list or tuple L'''
R = []
_flatten(L,R.append)
return R
print flatten(l)
(Trouvé là)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Présenté comme ça, c'est un peu mieux:
Ce qui donne: ['a', 2, 'b', 5, 't', 6, 1, 2, 'r', 897, 777, 888, 'hi', 98, 23, 'i', 7]
(Notez la possibilité de déclarer des fonctions locales en Python... très sympa !)
import types
def flatten(L):
'''Recursively flatten the list or tuple L.
Shamelessly heavily inspired from ReportLab_1_20.tgz/reportlab_1_20/reportlab/lib/utils.py
'''
def _flatten(L,a):
for x in L:
if type(x) in (types.ListType,types.TupleType): _flatten(x,a)
else: a(x)
R = []
_flatten(L,R.append)
return R
l = [('a', 2), ('b', 5), ('t', 6), [1, 2, 'r', (897,777,888), 'hi'], (98, 23, ('i', 7))]
print flatten(l)
Ce qui donne: ['a', 2, 'b', 5, 't', 6, 1, 2, 'r', 897, 777, 888, 'hi', 98, 23, 'i', 7]
(Notez la possibilité de déclarer des fonctions locales en Python... très sympa !)
Par contre, je crois qu'il serait plus pythonique d'utiliser isinstance() plutôt que de comparer les type().