1

我有字符串:

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

我想创建字符串

"ÀàÁáÂâ..."

即把绳子分成两半,然后把两半拉在一起。

我尝试了天真zip(a, b),但这没有用。我认为这是由于 unicode 的问题。

有谁知道我怎样才能得到我想要的结果?

4

4 回答 4

5

在 Python 2.x 中,字符串默认不是 unicode。在处理 unicode 数据时,您必须执行以下操作:

  • 带有字符的前缀字符串文字ua = u'ÀÁÂÃÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜ',或

  • 如果您想避免使用u前缀并且您正在使用的模块足够兼容,请使用from __future__ import unicode_literalsimport将字符串文字默认解释为 unicode

  • 如果您直接在 Python 代码中编写 unicode 字符串文字,请将 .py 文件保存为utf-8格式,以便正确解释文字。Python 2.3+ 将解释utf-8 BOM;一个好的做法是在文件的开头添加一个特定的注释行# -*- coding: utf-8 -*-来指示编码,或者

  • 您也可以继续将 .py 文件保存在 中ascii,但您需要转义文字中的 unicode 字符,这可能不太可读:'ÀÁÂÃ'应该变成'\xc0\xc1\xc2\xc3'

一旦满足了这些条件,剩下的就是对这些 un​​icode 字符串应用算法,就像使用 str 版本一样。__future__对于您的导入问题,这是一种可能的解决方案:

from __future__ import unicode_literals

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

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

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

更多参考资料:

  • PEP 263定义了非 ascii 编码的注释
  • PEP 3120将 utf-8 定义为 Python 3 中的默认编码
于 2012-05-18T09:56:29.337 回答
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))

ÀàÁáÂâÃãÈäÉèÊéËçÌêÍëÎìÏíÒîÓïÔòÕóÖôÙõÚöÛùÜúûüÿ
于 2012-05-18T09:35:36.080 回答
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
ÀàÁáÂâÃãÈäÉèÊéËçÌêÍëÎìÏíÒîÓïÔòÕóÖôÙõÚöÛùÜú

但请注意,zip 方法不会为您提供 'b' 字符串的其余部分,因为它在 'a' 字符串中没有一对。

于 2012-05-18T09:34:16.657 回答
0

这对我有用(Python 2.x):

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

你有什么错误?

于 2012-05-18T09:37:00.983 回答