Как сгладить несколько уровней кортежа и иметь элементы, разделенные табуляцией? - PullRequest
0 голосов
/ 17 октября 2019

Это функция для вычисления сходства слов, которую я написал с импортом xlwings, библиотеки python-excel. Я хочу, чтобы он возвращался так (что я ожидаю, это то, что элементы в каждой строке / строке должны быть разделены на вкладки. И тогда я мог бы легко скопировать / вставить в файл Excel для суммы), например:

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

Но на самом деле все возвращается вот так (что я ненавижу, так это то, что я не могу скопировать в файл Excel для дальнейшего использования, например суммирования цифр):

[[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))]]

Как я могу это понять? Спасибо.

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

1 Ответ

0 голосов
/ 17 октября 2019

Вы можете использовать следующую функцию. Источник: пост блога

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)

Тогда просто используйте:

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']]

Теперь вы можете присоединиться к отдельным спискам:

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

вывод

print(most_final[0])
0.9999998807907104  casual  1.0 1.0 29.0
...