在Python中将unicode字符串压缩在一起

时间:2012-05-18 09:26:06

标签: python string unicode permutation

我有字符串:

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

我想创建字符串

"ÀàÁáÂâ..."

即将字符串分成两部分,然后将两部分拉在一起。

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

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

4 个答案:

答案 0 :(得分:5)

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

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

  • 如果您想避免使用u前缀,并且您使用的模块是否足够兼容,使用from __future__ import unicode_literals import 可将字符串文字解释为默认情况下为unicode

  • 如果直接在Python代码中编写unicode字符串文字,utf-8格式保存.py文件,以便正确解释文字。 Python 2.3+将解释utf-8 BOM;一个好的做法是在文件开头add a specific comment line指示编码,如# -*- coding: utf-8 -*-

  • 您还可以继续将.py文件保存在ascii中,但是您需要转义文字中的unicode字符,这些字符可读性较差:{{ 1}}应该成为'ÀÁÂÃ'

一旦满足这些条件,剩下的就是在这些unicode字符串上应用算法,就像使用str版本一样。以下是'\xc0\xc1\xc2\xc3'导入问题的一种可能解决方案:

__future__

进一步参考:

  • PEP 263定义了非ascii编码注释
  • PEP 3120将utf-8定义为Python 3中的默认编码

答案 1 :(得分: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))

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

答案 2 :(得分: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'字符串中没有对。

答案 3 :(得分:0)

这正在我身边(Python 2.x):

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

你有什么错误?