Esta es una función para calcular la similitud de palabras que escribí con la importación de xlwings, una biblioteca de python-excel. Quiero que vuelva así (lo que espero es que los elementos en cada fila / línea se dividan por una pestaña. Y luego podría copiar / pegar fácilmente en un archivo de Excel por una suma), por ejemplo:

0.9999998807907104 'casual' 1.0 1.0 29.0
0.8386740684509277 'active' 0.3333 1.0 13.0
0.776314377784729 'cardigans'0.1667 1.0 84.0

Pero en realidad regresa así (lo que odio es que no pude copiarlo en un archivo de Excel para su uso posterior, como sumar dígitos):

[[0.9999998807907104, ('casual', (1.0, 1.0, 29.0))],
 [0.8386740684509277, ('active', (0.3333, 1.0, 13.0))],
 [0.776314377784729, ('cardigans', (0.1667, 1.0, 84.0))]]

¿Cómo podría darme cuenta de eso? Gracias.

def similarity(phrase, N=10):
    phrase_vec = phrase_model[phrase]
    CosDisList = []
    wb = xw.Book('file01.xlsx')
    sht = wb.sheets['sheet1']


    for a_word in phrase_model.keys():

        a_val = phrase_model[a_word]
        cos_dis = cosine_similarity(phrase_vec, a_val)

        for i in range(1, 18):

            if a_word == sht.cells(i, 1).value:
                DataFromExcel = (sht.cells(i, 2).value, sht.cells(i, 3).value, sht.cells(i, 4).value)
                DataCombined = (a_word, DataFromExcel)
                CosDisBind = [float(str(cos_dis.tolist()).strip('[[]]')), DataCombined]

                CosDisList.append(CosDisBind)

                CosDisListSort = sorted(CosDisList, key=operator.itemgetter(0), reverse=True)

                CosDisListTopN = heapq.nlargest(N, CosDisListSort)

    return CosDisListTopN
0
CoderTom 17 oct. 2019 a las 16:17

1 respuesta

La mejor respuesta

Puede utilizar la siguiente función. Fuente: una entrada de blog

def flatten(l, ltypes=(list, tuple)):
    ltype = type(l)
    l = list(l)
    i = 0
    while i < len(l):
        while isinstance(l[i], ltypes):
            if not l[i]:
                l.pop(i)
                i -= 1
                break
            else:
                l[i:i + 1] = l[i]
        i += 1
    return ltype(l)

Entonces solo usa:

abc = [[0.9999998807907104, ('casual', (1.0, 1.0, 29.0))],
       [0.8386740684509277, ('active', (0.3333, 1.0, 13.0))],
       [0.776314377784729, ('cardigans', (0.1667, 1.0, 84.0))]]
flat_list = flatten(abc)
final_array = np.array(flat_list).reshape((np.round(len(flat_list)//5), 5)).tolist()
# [['0.9999998807907104', 'casual', '1.0', '1.0', '29.0'], ['0.8386740684509277', 'active', '0.3333', '1.0', '13.0'], ['0.776314377784729', 'cardigans', '0.1667', '1.0', '84.0']]

Ahora puedes unirte a listas individuales:

most_final = ["\t".join(x) for x in final_array]
print(most_final[0])

salida

print(most_final[0])
0.9999998807907104  casual  1.0 1.0 29.0
0
pissall 17 oct. 2019 a las 13:45