Я все еще новый пользователь Python и пытаюсь создать самую длинную общую подпоследовательность с помощью Python. но я хотел бы знать, как сначала создать цикл для сравнения значения строка за строкой. Вот образец данных.
row col1 col2 col3 col4 col5 col6
0 'A' '11' 'B'
1 'A' '11' 'B' '121'
2 'A' '12' 'B' '123' '124'
3 'A' '13' 'B' '123' '124' '456'
вот пример кода LCS, который я собираюсь адаптировать.
import pandas as pd
df_hier = pd.read_csv("sample.csv")
row1 = df_hier.iloc[1:2, 2:20]
row2 = df_hier.iloc[3:4, 2:20]
def lcs(s1, s2):
matrix = [["" for x in range(len(s2))] for x in range(len(s1))]
for i in range(len(s1)):
for j in range(len(s2)):
if s1[i] == s2[j]:
if i == 0 or j == 0:
matrix[i][j] = s1[i]
else:
matrix[i][j] = matrix[i-1][j-1] + s1[i]
else:
matrix[i][j] = max(matrix[i-1][j], matrix[i][j-1], key=len)
cs = matrix[-1][-1]
return len(cs), cs
print(lcs(row1, row2))
Я создал еще одну функцию для архивирования LCS, которая
def lcs_rows(r1, r2):
pairs = zip(r1.values.flatten(), r2.values.flatten())
lcss = [lcs(*x) if len(x[0]) and len(x[1]) else (0, 'NaN') for x in pairs]
nums = [x[0] for x in lcss]
strs = [x[1] for x in lcss]
return (sum(nums).join(strs)
но в результате получена ошибка -> объект типа 'float' не имеет len ()
Предполагается, что
the row1 will use
'A' '11' 'B'
and row2
'A' '12' 'B' '121'
ожидаемый результат будет
(4, 'A1B1')
заранее спасибо






Что касается получаемой вами ошибки: «объект типа 'float' не имеет len ()» возникает из-за того, что вы пытаетесь выполнить функцию с NaN, в данном случае пытаясь передать NaN в len (). Вместо этого вы хотите проверить, является ли значение NaN, используя функции pd.isnull () / pd.notnull (). (сравнение с использованием "==" также не работает).
Между прочим, это не строка «NaN», а специальный объект, который вы можете указать с помощью: «pd.np.nan».
Предлагаю исправить следующую строку:
lcss = [lcs(*x) if pd.notnull(x[0]) and pd.notnull(x[1]) else (0, pd.np.nan) for x in pairs]
спасибо за ваш комментарий, я последовал вашему предложению, но ошибка появляется в возвращаемом значении.