Проблема здесь в том, что в юникоде некоторые символы могут состоять из комбинаций других символов. В этом случае 'lòng' включает строчные буквы 'o' и серьезный акцент в качестве отдельных символов.
>>> import unicodedata as ud
>>> w ='lòng'
>>> for c in w:
... print(ud.name(c))
...
LATIN SMALL LETTER L
LATIN SMALL LETTER O
COMBINING GRAVE ACCENT
LATIN SMALL LETTER N
LATIN SMALL LETTER G
Это разложенная строка в кодировке Unicode, поскольку акцентированный 'o'раскладывается на два символа. Модуль unicodedata предоставляет функцию normalize для преобразования между декомпозированными и составными формами:
>>> for c in ud.normalize('NFC', w):
... print(ud.name(c))
...
LATIN SMALL LETTER L
LATIN SMALL LETTER O WITH GRAVE
LATIN SMALL LETTER N
LATIN SMALL LETTER G
Если вы хотите узнать, является ли строканормализуется к определенной форме, но на самом деле не хочет ее нормализовать и использует Python 3.8+, более эффективная функция unicodedata.is_normalized ( кредит пользователю Acumenus ):
>>> ud.is_normalized('NFC', w)
False
>>> ud.is_normalized('NFD', w)
True
Unicode HOWTO в документации Python содержит раздел сравнения строк , в котором это обсуждается более подробно.