2017-09-08 3 views
0

Je construis une liste en python en faisant une boucle sur quelques blobs JSON et des éléments d'ajout. Parfois, les éléments sont simples, parfois doubles (ou plus).Ajout de N> = 1 éléments à une liste

my_list = []  
for j in jsons: 
    my_list.append(j['foo']) 

my_list finit par être ['a1', 'b1', ['c1', 'c2']]

Si je s'étendre à la place que je me ['a', '1', 'b', '1', 'c1', 'c2'].

Dois-je d'abord vérifier si ce que j'ajoute est une liste, puis l'ajouter par élément? Ou y a-t-il une meilleure fonction qui le fait déjà?

+6

La vérification explicite semble assez raisonnable, étant donné l'irrégularité déraisonnable de vos blobs JSON. Mais je vérifierais s'il s'agit d'une liste, puis '.extend', sinon,' .append'. Une autre approche consiste à aplatir plus tard ... mais probablement le meilleur juste pour vérifier. –

+0

Pourquoi les données ne sont-elles pas organisées de manière cohérente? Peut-être que vous pouvez corriger le code qui le crée. – Barmar

+0

Est-ce que je pourrais @ Barmar, mais ce sont des données publiques fournies par un gouvernement. – ScottieB

Répondre

3

Oui, vous devez vérifier explicitement chaque type d'élément.

Par exemple, vous pouvez écrire:

# sample jsons 
jsons = [{'foo': 'a1'}, 
     {'foo': 'b1'}, 
     {'foo': ['c1', 'c2']}] 

my_list = [] 
for json in jsons: 
    item = json['foo'] 
    if isinstance(item, list): 
     my_list.extend(item) 
    else: 
     my_list.append(item) 

Vous obtenez:

['a1', 'b1', 'c1', 'c2'] 

Mais, avec Python, vous pouvez utiliser un ternary conditional expression pour simplifier:

my_list = [] 
for json in jsons: 
    item = json['foo'] 
    my_list.extend(item if isinstance(item, list) else [item]) 
+0

Vous pouvez également utiliser l'expression ternaire pour sélectionner la méthode correcte à appeler, ce qui évite de créer la liste temporaire pour envelopper 'item'. '(mylist.extend si isinstance (item, liste) else mylist.append) (item)'. – chepner

+0

Vous avez raison, c'est inhabituel et peut être considéré comme un usage avancé ... ;-) –

2

Vous pouvez utiliser le décorateur singledispatch pour déplacer une partie de la plaque chauffante hors de votre boucle principale. Le décorateur est disponible depuis le module functools dans la bibliothèque standard à partir de Python 3.4, ou via le module singledispatch sur PyPi.

Ceci définit une fonction adder qui se comporte différemment selon le type de son (premier) argument.

@singledispatch 
def adder(item): 
    mylist.append(item) 

@adder.register(list) 
def _(item): 
    mylist.extend(item) 

mylist = [] 
for json in jsons: 
    adder(json['foo'])