es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo utilizar la función zip para asociar el número de columna con el valor de una celda de Excel utilizando openpyxl.

Estoy creando un diccionario donde las claves deberían ser el número de fila y los valores del diccionario deberían ser una lista de números de columna, determinado por los valores de esa fila, ordenados en orden descendente.

Mi código a continuación es:

from openpyxl import load_workbook

vWB = load_workbook(filename="voting.xlsx")
vSheet = vWB.active

d = {}
for idx, row in enumerate(vSheet.values, start=1):
    row = sorted(row, reverse=True)
    d[idx] = row

salida:

{1: [0.758968208500514, 0.434362232763003, 0.296177589742431, 0.0330331941352554], 2: [0.770423104229537, 0.770423104229537, 0.559322784244604, 0.455791535747786], etc..}

Lo que quiero:

{1: [4, 2, 1, 3], 2: [3, 4, 1, 2], etc..}

He estado intentando crear un número para representar el número de columna de cada valor:

genKey = [i for i in range(values.max_column)]

Y luego usando la función zip para asociar el número de columna con cada valor:

dict(zip(lista clave de columna, lista de valores))

Así tengo un diccionario con columnas como claves 1, 2, n y valores como valores, luego puedo ordenar las claves en orden descendente y puedo iterar sobre las filas y usar zip nuevamente con la clave siendo el número de fila.

No estoy seguro de cómo usar esta función zip y llegar a mi punto final deseado. Cualquier ayuda es bienvenida.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr su punto final deseado, puede modificar su código existente de la siguiente manera:

    from openpyxl import load_workbook
    
    vWB = load_workbook(filename="voting.xlsx")
    vSheet = vWB.active
    
    d = {}
    for idx, row in enumerate(vSheet.values, start=1):
        # Creamos un diccionario con los números de columna como claves y los valores como valores
        row_dict = {col_num: val for col_num, val in enumerate(row, 1)}
        # Ordenamos el diccionario en orden descendente de los valores y extraemos las claves como una lista
        sorted_cols = [col_num for col_num, _ in sorted(row_dict.items(), key=lambda x: x[1], reverse=True)]
        d[idx] = sorted_cols
    
    print(d)
    

    Aquí, primero creamos un diccionario row_dict para cada fila, donde las claves son los números de columna (comenzando desde 1) y los valores son los valores correspondientes de las celdas.

    Luego, ordenamos este diccionario en orden descendente de los valores utilizando sorted() y extraemos las claves (es decir, los números de columna) como una lista utilizando una comprensión de lista con sorted_cols = [col_num for col_num, _ in sorted(row_dict.items(), key=lambda x: x[1], reverse=True)].

    Finalmente, agregamos esta lista ordenada de números de columna como el valor para la clave idx en el diccionario principal d.

    Esto debería darle la salida deseada.

Comments are closed.