2012-05-18 59 views
1

Unicode字符串我有字符串:荏苒一起在Python

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

,我想建立一個字符串

"ÀàÁáÂâ..." 

即一分爲二的字符串,然後將拉鍊半在一起。

我試過了天真zip(a, b)但這沒有奏效。我認爲這是由於unicode的問題。

有誰知道我怎麼能得到我想要的結果?

+0

你得到什麼錯誤? –

+0

我以爲有人問哪個Python版本:Python 2.7版 –

+0

@Nick,當我試圖壓縮,然後加入串輸出爲 'ÀÁÂÃÈÉÊ Ë Ì Í Î Ï Ù ' –

回答

5

在Python 2.x中,默認情況下字符串不是unicode。當處理unicode數據時,你必須做到以下幾點:與u字符

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

  • ,如果你想避免u前綴,如果模塊你與正在足夠兼容,使用from __future__ import unicode_literals進口使默認解釋爲Unicode字符串

  • 如果您直接在您的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'

一旦你滿足這些條件,剩下的就是關於這些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中
+0

偉大的,精心設計的答案。我會添加一個關於'#coding ='的單詞到第3項。 – georg

+0

@ thg435同意並完成。謝謝 – Boud

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

或者,用拉鍊:

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

但是要注意,一個拉鍊方法不會給你的「B」字符串的其餘部分,因爲它不具有「一一對'串。

+0

itertools.izip_longest將解決這個列表是不同的尺寸 –

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

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

我覺得我沒有將它們定義爲一個新手的錯誤unicode字符串和itertools.izip_longest將解決名單是不同的大小:) –

+0

@BenPage,你是正確的,改爲使用izip_longest。在位置0 – Josiah

0

這是工作在我身邊(的Python 2.x的):

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

你有什麼錯誤?

+0

當我試圖使用encode函數(我是不添加「UTF-8」 PARAM,我得到'「ASCII」編解碼器不能解碼字節0xc3:順序不在範圍內(128)' 但如果我將字符串定義爲「...」,那麼它就起作用:) –