Я хотел бы добавить, что если вы получите расширение MoreLinq, теперь есть поддержка как гомогенных, так и гетерогенных левых соединений теперь
http://morelinq.github.io/2.8/ref /api/html/Overload_MoreLinq_MoreEnumerable_LeftJoin.htm
пример:
//Pretend a ClientCompany object and an Employee object both have a ClientCompanyID key on them
return DataContext.ClientCompany
.LeftJoin(DataContext.Employees, //Table being joined
company => company.ClientCompanyID, //First key
employee => employee.ClientCompanyID, //Second Key
company => new {company, employee = (Employee)null}, //Result selector when there isn't a match
(company, employee) => new { company, employee }); //Result selector when there is a match
EDIT:
В ретроспективе это может сработать, но оно преобразует IQueryable для IEnumerable, поскольку morelinq не преобразует запрос в SQL.
Вместо этого вы можете использовать GroupJoin, как описано здесь: https://stackoverflow.com/a/24273804/4251433
Это гарантирует, что он останется как IQueryable, если вам понадобится дальнейшие логические операции над ним позже.
Unidecode - правильный ответ. Он транслитерирует любую строку Unicode в максимально возможное представление в тексте ascii.
Пример:
accented_string = u'Málaga'
# accented_string is of type 'unicode'
import unidecode
unaccented_string = unidecode.unidecode(accented_string)
# unaccented_string contains 'Malaga'and is of type 'str'
Как насчет этого:
import unicodedata
def strip_accents(s):
return ''.join(c for c in unicodedata.normalize('NFD', s)
if unicodedata.category(c) != 'Mn')
Это работает над греческими буквами, также:
>>> strip_accents(u"A \u00c0 \u0394 \u038E")
u'A A \u0394 \u03a5'
>>>
символьная категория "Mn" обозначает Nonspacing_Mark
, который подобен unicodedata.combining в ответе MiniQuark (я не думал о unicodedata.combining, но это - вероятно, лучшее решение, потому что это более явно).
И имеют в виду, эти манипуляции могут значительно изменить значение текста. Диакритические знаки, Умляуты и т.д. не являются "художественным оформлением".
Я просто нашел этот ответ в сети:
import unicodedata
def remove_accents(input_str):
nfkd_form = unicodedata.normalize('NFKD', input_str)
only_ascii = nfkd_form.encode('ASCII', 'ignore')
return only_ascii
Это хорошо работает (для французского языка, например), но я думаю, что второй шаг (удаляющий диакритические знаки) мог быть обработан лучше, чем отбрасывание символов неASCII, потому что это перестанет работать для некоторых языков (греческий язык, например). Лучшее решение состояло бы в том, чтобы, вероятно, явно удалить unicode символы, которые отмечены как являющийся диакритическими знаками.
Редактирование : это добивается цели:
import unicodedata
def remove_accents(input_str):
nfkd_form = unicodedata.normalize('NFKD', input_str)
return u"".join([c for c in nfkd_form if not unicodedata.combining(c)])
unicodedata.combining(c)
возвратит true, если символ c
может быть объединен с предшествующим символом, который является главным образом, если это - диакритический знак.
Редактирование 2 : remove_accents
ожидает строка unicode, не строка байтов. Если у Вас есть строка байтов, то необходимо декодировать ее в строку unicode как это:
encoding = "utf-8" # or iso-8859-15, or cp1252, or whatever encoding you use
byte_string = b"café" # or simply "café" before python 3.
unicode_string = byte_string.decode(encoding)