Вопрос по string, python, unicode – Сжатие строк Юникода в Python

1

У меня есть строка:

a = "ÀÁÂÃÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜ" b = "àáâãäèéçêëìíîïòóôõöùúûüÿ"

и я хочу создать строку

"ÀàÁáÂâ..."

Т.е. разделить строку на две части, а затем сжать половинки вместе.

Я попробовал наивныйzip(a, b) но это не сработало. Я думаю, что это связано с проблемой Unicode.

Кто-нибудь знает, как я могу получить желаемый результат?

Я думал, что кто-то спросил, какая версия Python: Python 2.7 Ben Page
@BenPage В Python 2.7 убедитесь, что вы объявили свои строки как Unicode: либо префикс строки сuили используйтеfrom __future__ import unicode_literals Boud
Какую ошибку вы получили? Niek de Klein
@ Ник, Когда я попытался сжать затем соединить строки, вывод был�À��Á��Â��Ã��È��É��Ê��Ë��Ì��Í��Î��Ï��Ò��Ó��Ô��Õ��Ö��Ù��Ú��Û��Ü� Ben Page

Ваш Ответ

4   ответа
0

>>> a = unicode('ÀÁÂÃÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜ', 'utf-8')
>>> b = unicode('àáâãäèéçêëìíîïòóôõöùúûüÿ', 'utf-8')
>>> print ''.join([ ''.join(c) for c in zip(a, b)])
ÀàÁáÂâÃãÈäÉèÊéËçÌêÍëÎìÏíÒîÓïÔòÕóÖôÙõÚöÛùÜú

Какая у вас ошибка?

Error: User Rate Limit Exceeded'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)Error: User Rate Limit Exceeded Ben Page
0

>>> a_longer = len(a) > len(b)
>>> new_string = ""
>>> for i in range((min(len(a), len(b)))):
...     new_string += a[i] + b[i]
... 
>>> if a_longer:
...     new_string += a[i:]
... else:
...     new_string += b[i:]
... 
>>> print new_string
ÀàÁáÂâÃãÈäÉèÊéËçÌêÍëÎìÏíÒîÓïÔòÕóÖôÙõÚöÛùÜúúûüÿ

Или, используя zip:

>>> a = u'ÀÁÂÃÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜ'
>>> b = u'àáâãäèéçêëìíîïòóôõöùúûüÿ'
>>> c = zip(a, b)
>>> new_string = "".join([a + b for a, b in c])
>>> print new_string
ÀàÁáÂâÃãÈäÉèÊéËçÌêÍëÎìÏíÒîÓïÔòÕóÖôÙõÚöÛùÜú

Но обратите внимание, что метод почтового индекса не даст вам остальную часть "b" строка, так как у нее нет пары в 'a'; строка.

Error: User Rate Limit Exceeded Ben Page
5

нными Unicode вы должны сделать следующее:

prefix string literals with u character: a = u'ÀÁÂÃÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜ', or

if you want to avoid the u prefix and if the modules you are working with are enough compatible, use from __future__ import unicode_literals import to make string literals interpreted as unicode by default

if you write unicode string literals directly in your Python code, save your .py file in utf-8 format so that the literals are correctly interpreted. Python 2.3+ will interpret the utf-8 BOM ; a good practice is also to add a specific comment line at the beginning of the file to indicate the encoding like # -*- coding: utf-8 -*-, or

you can also keep saving the .py file in ascii, but you will need to escape the unicode characters in the literals, which can be less readable: 'ÀÁÂÃ' should become '\xc0\xc1\xc2\xc3'

Как только вы выполните эти условия, остальное - применение алгоритмов к этим строкам юникода так же, как если бы вы работали с версией str. Вот одно из возможных решений вашей проблемы с__future__ Импортировать:

from __future__ import unicode_literals

from itertools import chain
a = "ÀÁÂÃÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜ"
b = "àáâãäèéçêëìíîïòóôõöùúûüÿ"

print ''.join(chain(*zip(a,b)))

>>> ÀàÁáÂâÃãÈäÉèÊéËçÌêÍëÎìÏíÒîÓïÔòÕóÖôÙõÚöÛùÜú

Дальнейшие ссылки:

PEP 263 defines the non-ascii encoding comments PEP 3120 defines utf-8 as the default encoding in Python 3
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded#coding=Error: User Rate Limit Exceeded
3

как вы заархивировали их, а также вы должны определить их как строки Unicode:

>>>import itertools
>>>a = u"ÀÁÂÃÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜ"
>>>b = u"àáâãäèéçêëìíîïòóôõöùúûüÿ"
>>>zipped = itertools.izip_longest(a,b, fillvalue="")
>>>print "".join(["".join(x) for x in zipped])

ÀàÁáÂâÃãÈäÉèÊéËçÌêÍëÎìÏíÒîÓïÔòÕóÖôÙõÚöÛùÜúûüÿ

>>>zipped = itertools.izip_longest(a,b, fillvalue="")
>>>print "".join(map("".join, zipped))

ÀàÁáÂâÃãÈäÉèÊéËçÌêÍëÎìÏíÒîÓïÔòÕóÖôÙõÚöÛùÜúûüÿ
Error: User Rate Limit Exceeded Ben Page
Error: User Rate Limit Exceeded

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