荏苒在Python一起unicode字符串(Zipping together unicode str

2019-07-29 10:45发布

我有字符串:

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

我想建立一个字符串

"ÀàÁáÂâ..."

即一分为二的字符串,然后将拉链半在一起。

我试过天真zip(a, b)但这并没有工作。 我认为,这是由于使用Unicode的一个问题。

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

Answer 1:

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

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

  • 如果你想避免u前缀,如果你正在使用的模块有足够的兼容, 使用from __future__ import unicode_literals导入作出解释为默认Unicode字符串

  • 如果你直接在你的Python代码编写Unicode字符串, 保存.py文件在utf-8格式 ,从而文字的正确解释。 Python的2.3+会解释UTF-8 BOM ; 一个很好的做法也是添加特定注释行 ,在该文件的开头来指示,如编码# -*- coding: utf-8 -*-

  • 您还可以保持储蓄在.py文件ascii ,但你需要逃避在文字中的Unicode字符 ,这可以少读: 'ÀÁÂÃ'应该成为'\xc0\xc1\xc2\xc3'

一旦你满足这些条件,剩下的就是关于这些Unicode字符串应用算法,你将与海峡版本相同的方式工作。 这里是你的问题与一个可能的解决方案__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的默认编码


Answer 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))

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


Answer 3:

也许不漂亮,但工作之一。

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

或者,用拉链:

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

但要小心,一个拉链方法不会给你的“B”字符串的其余部分,因为它没有在“A”串一对。



Answer 4:

这是工作在我身边(的Python 2.x的):

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

你有什么错误?



文章来源: Zipping together unicode strings in Python