Trabajando en la impresión de una columna vertical desde una matriz pasada como una cadena.

Creé un diccionario y asigné cada fila de la matriz como un valor en el dict luego entre corchetes para crear un diccionario de listas.

Me gustaría recorrer cada clave en el dict y agregar el valor del índice dado (por ejemplo, si el valor es 'a b c', devolver 'a' para 1, '' para 2 ...) pero todo lo que sigo obteniendo es:

[['a b c '], ['a b c '], ['a b c ']]

O variaciones sobre esto cuando jugueteo con él. Parece que nunca pasa de la fila 1, aunque cada valor es claramente una fila diferente en la matriz.

Agradezco cualquier ayuda.

def column (str, index):
    output = []
    li = str.split("\n")
    row_dict = {
            1: [li[0]],
            2: [li[1]],
            3: [li[2]] 
            }
    for key in row_dict:
        output.append(row_dict[index])
    return output

str = "a b c \n d e f \n g h i"
column(str, 1)
1
user3763074 4 oct. 2019 a las 07:06

3 respuestas

La mejor respuesta

Primero, divida en "\n " porque parece tener un espacio en blanco después de cada nueva línea.

Obtener el enésimo elemento de cada fila es bastante sencillo si utiliza las comprensiones de listas, p. [row[index] for row in s.split("\n ")].

En total:

>>> def column (s, index):
    return [row[index] for row in s.split("\n ")]

>>> s = "a b c \n d e f \n g h i"
>>> column(s, 1)
[' ', ' ', ' ']

O, si desea que esté indexado en 1 (como en el ejemplo de la pregunta) en lugar de indexado en 0:

>>> def column (s, index):
    return [row[index-1] for row in s.split("\n ")]

>>> s = "a b c \n d e f \n g h i"
>>> column(s, 1)
['a', 'd', 'g']
1
Ruzihm 4 oct. 2019 a las 04:22

Probablemente olvidó mencionar el key en el que estaba iterando. Su función debería ser algo como:

def column(str, index):
    output = []
    li = str.split("\n")
    row_dict = {
            1: li[0].lstrip().split(' '),
            2: li[1].strip().split(' '),
            3: li[2].strip().split(' ')
    }
    for key in row_dict:
        output.append(row_dict[key][index])
    return output

Además, tenga en cuenta que estaba agregando [] adicional a los valores de row_dict. Finalmente, los objetos iterables en Python comienzan desde un índice 0, por lo que llamaría a su función como column("a b c \n d e f \n g h i", 0).

Espero que ayude.

1
khan 4 oct. 2019 a las 04:19

Por lo que puedo ver, el único problema con su código es que está agregando el valor del diccionario (que es una fila, y no el valor real, por ejemplo, está obteniendo la fila en key = 'index', en lugar de valor en la ubicación 'índice' en cada uno de los diccionarios) a la salida, cuando desee asignar un valor particular de cada fila ... esto es lo que debe hacer:

for key in row_dict:
    output.append(row_dict[key].split()[index])
    print (row_dict[key].split()[index])

Para index = 1, esto imprimirá:

b
e
h

Esto hace tres cosas en una declaración:

  1. obtiene la cadena almacenada en key = 'key' del diccionario
  2. divide su cadena en caracteres individuales (para que pueda extraerlos más fácilmente)
  3. Obtiene el carácter / palabra en el índice especificado por sus parámetros.
1
Hiten 4 oct. 2019 a las 04:17
58229781