латинский 1 к ASCII

Вы могли бы хотеть посмотреть uniq и sort приложения.

./yourscript.ksh | sort | uniq

(к вашему сведению, да, вид необходим в этой командной строке, uniq только, полосы копируют строки, которые сразу являются друг после друга)

РЕДАКТИРОВАНИЕ:

Вопреки тому, что было отправлено [1 112] Aaron Digulla относительно uniq параметры командной строки:

, Учитывая следующий вход:

class
jar
jar
jar
bin
bin
java

uniq произведет все строки точно однажды:

class
jar
bin
java

uniq -d произведет все строки, которые появляются несколько раз, и это распечатает их однажды:

jar
bin

uniq -u произведет все строки, которые появляются точно однажды, и это распечатает их однажды:

class
java

16
задан Anurag Uniyal 9 June 2011 в 06:00
поделиться

4 ответа

Итак, вот три подхода, более или менее как указано или предложено в других ответах:

# -*- coding: utf-8 -*-
import codecs
import unicodedata

x = u"Wikipédia, le projet d’encyclopédie"

xtd = {ord(u'’'): u"'", ord(u'é'): u'e', }

def asciify(error):
    return xtd[ord(error.object[error.start])], error.end

codecs.register_error('asciify', asciify)

def ae():
  return x.encode('ascii', 'asciify')

def ud():
  return unicodedata.normalize('NFKD', x).encode('ASCII', 'ignore')

def tr():
  return x.translate(xtd)

if __name__ == '__main__':
  print 'or:', x
  print 'ae:', ae()
  print 'ud:', ud()
  print 'tr:', tr()

Выполнить как основной, это испускает:

or: Wikipédia, le projet d’encyclopédie
ae: Wikipedia, le projet d'encyclopedie
ud: Wikipedia, le projet dencyclopedie
tr: Wikipedia, le projet d'encyclopedie

ясно показывая, что подход на основе юникодированных данных, в то время как он удобен тем, что ему не нужна карта перевода xtd , он не может правильно переводить все символы в автоматическом режиме (он работает для букв с диакритическими знаками, но не для обратного апострофа), поэтому ему также потребуется некоторый вспомогательный шаг, чтобы разобраться с ними (несомненно, до того, каково теперь его тело).

Производительность также интересна. На моем ноутбуке с Mac OS X 10.5 и системой Python 2.5 довольно часто повторяется:

$ python -mtimeit -s'import a' 'a.ae()'
100000 loops, best of 3: 7.5 usec per loop
$ python -mtimeit -s'import a' 'a.ud()'
100000 loops, best of 3: 3.66 usec per loop
$ python -mtimeit -s'import a' 'a.tr()'
10000 loops, best of 3: 21.4 usec per loop

translate работает на удивление медленно (по сравнению с другими подходами). Я считаю, что проблема в том, что словарь проверяется для каждого символа в случае translate (и большинства из них нет), а только для тех немногих символов, которые ЕСТЬ там с asciify подход.

Итак, для полноты, вот подход "усиленных юникодированных данных":

specstd = {ord(u'’'): u"'", }
def specials(error):
  return specstd.get(ord(error.object[error.start]), u''), error.end
codecs.register_error('specials', specials)

def bu():
  return unicodedata.normalize('NFKD', x).encode('ASCII', 'specials')

это дает правильный результат, НО:

$ python -mtimeit -s'import a' 'a.bu()'
100000 loops, best of 3: 10.7 usec per loop

... скорость уже не так хороша. Итак, если скорость имеет значение, то без сомнения стоит сделать полный диктат перевода xtd и использовать подход asciify . Когда несколько дополнительных микросекунд на перевод не имеют большого значения, можно рассмотреть подход bu просто из-за его удобства (требуется только перевод dict для, надеюсь, небольшого числа специальных символов, которые не

15
ответ дан 30 November 2019 в 17:05
поделиться

"Правильный" способ сделать это - зарегистрировать свой собственный обработчик ошибок для кодирования / декодирования Unicode, и в этом обработчике ошибок обеспечить замену è на e и ö на o и т. Д.

Примерно так:

# -*- coding: UTF-8 -*-
import codecs

map = {u'é': u'e',
       u'’': u"'",
       # ETC
       }

def asciify(error):
    return map[error.object[error.start]], error.end

codecs.register_error('asciify', asciify)

test = u'Wikipédia, le projet d’encyclopédie'
print test.encode('ascii', 'asciify')

Вы также можете найти что-то в библиотеке IBM ICU и привязки Python PyICU , хотя, возможно, это будет меньше работы.

8
ответ дан 30 November 2019 в 17:05
поделиться

Макетранс (и перевод) затем преобразовать в ascii:

intab = u'áéí'  # extend as needed
outtab = u'aei' # as well as this one
table = maketrans(intab, outtab)

text = translate(u"Wikipédia, le projet d’encyclopédie", table)

try:
    temp = unicode(text, "utf-8")
    fixed = unicodedata.normalize('NFKD', temp).encode('ASCII', action)
    return fixed
except Exception, errorInfo:
    print errorInfo
    print "Unable to convert the Unicode characters to xml character entities"
    raise errorInfo

(из здесь )

1
ответ дан 30 November 2019 в 17:05
поделиться

Без измерений я бы ожидал, что метод .translate для строк Unicode - самое быстрое решение. Тем не менее, вам обязательно следует провести свои собственные измерения.

0
ответ дан 30 November 2019 в 17:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: