【问题标题】:Zipping together unicode strings in Python在 Python 中将 unicode 字符串压缩在一起
【发布时间】:2012-05-25 20:57:08
【问题描述】:

我有字符串:

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

我想创建字符串

"ÀàÁáÂâ..."

即将字符串分成两半,然后将两半压缩在一起。

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

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

【问题讨论】:

  • 我以为有人问python是哪个版本:python 2.7
  • @Nick,当我尝试压缩然后加入字符串时,输出为�À��Á��Â��Ã��È��É��Ê��Ë��Ì��Í��Î��Ï��Ò��Ó��Ô��Õ��Ö��Ù��Ú��Û��Ü�
  • @BenPage 在 Python 2.7 中,确保将字符串声明为 unicode:使用u 为字符串添加前缀,或使用from __future__ import unicode_literals

标签: python string unicode permutation


【解决方案1】:

也许不漂亮,但很实用。

>>> 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' 字符串中没有一对。

【讨论】:

  • itertools.izip_longest 将解决不同大小的列表
【解决方案2】:

你必须在压缩它们之后加入它们,并且你需要将它们定义为 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))

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

【讨论】:

  • 我认为我有一个新手错误,没有将它们定义为 unicode 字符串,而 itertools.izip_longest 将解决不同大小的列表:)
【解决方案3】:

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

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

你有什么错误?

【讨论】:

  • 当我尝试使用 unicode 函数时(我没有添加 'utf-8' 参数,我得到了 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128) 但如果我将字符串定义为 u"..." 它可以工作. :)
【解决方案4】:

在 Python 2.x 中,默认情况下字符串不是 unicode。在处理 unicode 数据时,必须做到以下几点:

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

  • 1234563 /p>
  • 如果您直接在 Python 代码中编写 unicode 字符串文字,将 .py 文件保存为 utf-8 格式,以便正确解释文字。 Python 2.3+ 将解释 utf-8 BOM ;一个好的做法也是在文件开头以add a specific comment line 指示编码,如# -*- 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编码的cmets
  • PEP 3120 将 utf-8 定义为 Python 3 中的默认编码

【讨论】:

  • 很好,详尽的答案。我会在第 3 个项目符号中添加一个关于 #coding= 的词。
猜你喜欢
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 2023-02-01
  • 2012-01-20
相关资源
最近更新 更多