2010-03-07 25 views
40

que tienen un diccionario de la siguiente manera:¿Cómo puedo crear una matriz/lista de diccionarios en python?

{'A':0,'C':0,'G':0,'T':0} 

que quieren crear una matriz con muchos diccionarios en ella, de la siguiente manera:

[{'A':0,'C':0,'G':0,'T':0},{'A':0,'C':0,'G':0,'T':0},{'A':0,'C':0,'G':0,'T':0},...] 

Este es mi código:

weightMatrix = [] 
for k in range(motifWidth): 
    weightMatrix[k] = {'A':0,'C':0,'G':0,'T':0} 

Pero, por supuesto, no está funcionando. Alguien me puede dar una pista? Gracias.

+4

+1 porque me encontré con esta pregunta utilizando términos genéricos de búsqueda, sin embargo, para * * precisamente el mismo propósito –

Respuesta

9

Uso

weightMatrix = [] 
for k in range(motifWidth): 
    weightMatrix.append({'A':0,'C':0,'G':0,'T':0}) 
4

I suponer que motifWidth contiene un número entero.

En Python, las listas no cambian de tamaño a menos que se lo indiquen. Por lo tanto, Python lanza una excepción cuando intenta cambiar un elemento que no está allí. Creo que desee:

weightMatrix = [] 
for k in range(motifWidth): 
    weightMatrix.append({'A':0,'C':0,'G':0,'T':0}) 

Por lo que vale la pena, cuando se hacen preguntas en el futuro, sería de ayuda si se incluye el seguimiento de pila que muestra el error que está recibiendo en lugar de simplemente diciendo "no es trabajando". Eso nos ayudaría a descubrir directamente la causa del problema, en lugar de tratar de descifrarlo a partir de su código.

Espero que ayude!

+3

1 me gustaría añadir la pista "Cuidado con los' matriz = [ {'A': 0}, ...] * motifWidth' ya que crea una lista de elementos que hacen referencia al mismo objeto. –

28
weightMatrix = [{'A':0,'C':0,'G':0,'T':0} for k in range(motifWidth)] 
+3

+1 porque la comprensión de la lista es el camino a seguir (más legible, elegante y conciso que un bucle de ' .append' calls), a pesar de que 'k in motifWidth' en la respuesta original era un error obvio y horrible (¡he editado la Respuesta para arreglar eso! -). –

+0

Impresionante, eso funciona. ¡Gracias! –

39

Esto es cómo lo hice y funciona:

dictlist = [dict() for x in range(n)] 

Se le da una lista de n diccionarios vacías.

+1

que wasn ' t lo que preguntó ... y ya fue respondido 2 años Hace – yprez

+1

lo siento, pero quizás debería usar una pregunta sobre el título diferente ... – user1850980

+0

Sí, debería haber hecho una pregunta diferente. – Derek

-1

Diccionario:

dict = {'a':'a','b':'b','c':'c'} 

gama de diccionario

arr = (dict,dict,dict) 
arr 
({'a': 'a', 'c': 'c', 'b': 'b'}, {'a': 'a', 'c': 'c', 'b': 'b'}, {'a': 'a', 'c': 'c', 'b': 'b'}) 
+7

Primero, nunca debe usar 'dict' como nombre de variable, y segundo, está creando una tupla (no una lista) que contiene el * mismo * diccionario tres veces, por lo que cada cambio que realice en una de ellas afecta a todos los demás. –

2

variación menor a la respuesta de user1850980 (para la pregunta "¿Cómo inicializar una lista de diccionarios vacíos") utilizando la lista constructor:

dictlistGOOD = list({} for i in xrange(listsize)) 

Me enteré para mi disgusto, esto NO funciona:

dictlistFAIL = [{}] * listsize # FAIL! 

, ya que crea una lista de referencias al diccionario vacío misma, de manera que si se actualiza un diccionario en la lista, todas las otras referencias se actualizan también.

Prueba estas actualizaciones para ver la diferencia:

dictlistGOOD[0]["key"] = "value" 
dictlistFAIL[0]["key"] = "value" 

(en realidad estaba buscando la respuesta de user1850980 a la pregunta formulada, por lo que su/su respuesta fue útil.)

0

Prueba esto:

lst = [] 
##use append to add items to the list. 

lst.append({'A':0,'C':0,'G':0,'T':0}) 
lst.append({'A':1,'C':1,'G':1,'T':1}) 

##if u need to add n no of items to the list, use range with append: 
for i in range(n): 
    lst.append({'A':0,'C':0,'G':0,'T':0}) 

print lst 
Cuestiones relacionadas