2017-07-24 1 views
1

Étant donné une liste de listes, matrix (ligne j et colonne k, valeur de l'élément) Je peux faire une liste aplatie des valeurs avec la liste -comprehension:créer dict avec les clés des lignes matricielles dans la forme {row: [col, valeur]}

matrix = [['00','01','02'],['10','11','12'],['20','21','22']] 
list_1 = [value for (j,row) in enumerate(matrix) for (k,value) in enumerate(row)] 
print(list_1) 
#output: ['00', '01', '02', '10', '11', '12', '20', '21', '22'] 

mimant imbriquée pour boucle syntaxe:

list_2 = [] 
for (j,row) in enumerate(matrix): 
    for (k,value) in enumerate(row): 
     list_2.append(value) 

Si je voulais un dictionnaire pour les entrées de forme {j: [k, valeur]}, ce qui est l'équivalent dict syntaxe de compréhension, et pourquoi n'utilise pas un travail équivalent bouclés bouclés? par exemple:

list_3 = {j:[k,value] for (j,row) in enumerate(matrix) for (k,value) in enumerate(row)} 

#expected output: {0:[0,'00'], 0:[1,'01'], 0:[2,'02']...} 
#actual output: {0: [2, '02'], 1: [2, '12'], 2: [2, '22']} 
+0

pourquoi utiliser 'enumerate' dans le premier exemple? –

+4

Veuillez fournir un exemple d'entrée et de sortie désirée pour le cas 'dict' –

+0

Essayez' a_list = [{j: [k, valeur]} pour (j, row) dans ...] ' – ksai

Répondre

1

Theres rien à redire avec votre code. Les clés Dict sont conçues pour être uniques et les clés dupliquées ne sont pas possibles dans les dictionnaires, puisque la référence est la même clé dans la compréhension des données. Les données seront remplacées comme vous pouvez le voir dans votre sortie réelle.Vous pouvez utiliser le code de cette manière

matrix = [['00','01','02'],['10','11','12'],['20','21','22']] 
a_list = {j:row for (j,row) in enumerate(matrix)} 
for key,value in a_list.items(): 
    new_list = {} 
    for i,j in enumerate(value): 
     new_list[i]=j 
    a_list[key] = new_list 
a_list 

sortie:

{0: {0: '00', 1: '01', 2: '02'}, 
1: {0: '10', 1: '11', 2: '12'}, 
2: {0: '20', 1: '21', 2: '22'}} 

ou

matrix = [['00','01','02'],['10','11','12'],['20','21','22']] 
a_list = {j:row for (j,row) in enumerate(matrix)} 
for key,value in a_list.items(): 
    new_list = [] 
    for i,j in enumerate(value): 
     new_list.append([i,j]) 
    a_list[key] = new_list 
a_list 

sortie: 01

+0

Ceci est correct. Cependant, je veux une recherche rapide par ligne, donc une clé ne sera pas utile; Y at-il un moyen d'obtenir la collection d'éléments avec une valeur de ligne donnée à court de dicts imbriqués? – ConfusinglyCuriousTheThird

+1

Cant vous juste ajouter la rangée entière pour cette clé? – Dark

+0

c'est une pensée ... – ConfusinglyCuriousTheThird