Что касается эффективности во время выполнения, другие ответили лучше, чем я. Если у вас всегда будет то же число уравнений, что и для переменных, мне нравится правило Крамера , поскольку его легко реализовать. Просто напишите функцию для вычисления определителя матрицы (или используйте уже написанную, я уверен, что вы можете найти ее там) и разделите определители двух матриц.
Если вам нужна строка ASCII, которая однозначно представляет то, что у вас есть, без потери информации , ответ прост:
Не возитесь с кодировкой / decode используйте функцию repr ()
(Python 2.X) или функцию ascii ()
(Python 3.x).
Вы говорите «кодировка различается». Я предполагаю, что под «этим» вы подразумеваете «строку» Python 2.x, которая на самом деле представляет собой последовательность байтов.
Ответ на первую часть: если вы не знаете кодировку этой закодированной строки, тогда нет , с ним вообще невозможно сделать что-либо значимое *. Если вы знаете кодировку, то первым шагом будет преобразование вашей str
в unicode
:
encoded_string = i_have_no_control()
the_encoding = 'utf-8' # for the sake of example
text = unicode(encoded_string, the_encoding)
Затем вы можете перекодировать свой объект Unicode как ASCII, если хотите.
ascii_garbage = text.encode('ascii', 'replace')
* Существуют эвристические методы для угадывания кодировок, но они медленные и ненадежные. Вот одна отличная попытка на Python .
Если все, что вам нужно, это сохранить ASCII-совместимые символы и выбросить остальные, то в большинстве кодировок это сводится к удалению всех символов, имеющих старший бит set - т.е. символы со значением больше 127. Это работает, потому что почти все наборы символов являются расширениями 7-битного ASCII.
Если это обычная строка (т.е. не unicode
]), вам необходимо декодировать его в произвольном наборе символов (например, iso-8859-1
, потому что он принимает любые байтовые значения), а затем закодировать в ascii, используя ignore
или replace
вариант для ошибок:
>>> orig = '1ä2äö3öü4ü'
>>> orig.decode('iso-8859-1').encode('ascii', 'ignore')
'1234'
>>> orig.decode('iso-8859-1').encode('ascii', 'replace')
'1??2????3????4??'
Шаг декодирования необходим, потому что вам нужна строка unicode для использования кодирования. Если у вас уже есть строка Unicode, это проще:
>>> orig = u'1ä2äö3öü4ü'
>>> orig.encode('ascii', 'ignore')
'1234'
>>> orig.encode('ascii', 'replace')
'1??2????3????4??'
I ' d попытаться нормализовать строку, а затем закодировать ее. Что насчет:
import unicodedata
s = u"éèêàùçÇ"
print unicodedata.normalize('NFKD',s).encode('ascii','ignore')
Это работает, только если у вас в качестве входных данных используется юникод. Поэтому вы должны знать, что можно кодировать и декодировать выходные данные функции. Если вы этого не сделаете, есть эвристики обнаружения кодирования, но для коротких строк они ненадежны.
Конечно, вам может повезти , и выходные данные функции зависят от различных неизвестных кодировок, но с использованием ascii в качестве базы кода они будут выделять одинаковое значение для байтов от 0 до 127 (например, utf-8).
В этом случае вы можете просто избавиться от ненужных символов, отфильтровав их с помощью OrderedSets :
import string.printable # asccii chars
print "".join(OrderedSet(string.printable) & OrderedSet(s))
Или, если вам нужны пробелы:
print("".join(((char if char in string.printable else " ") for char in s )))
"translate" может помочь вам сделать то же самое.
Единственный способ узнать, так ли повезло тебе, - это попробовать ... Иногда,