1

私は文字列を持っています:

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

文字列を作成したい

"ÀàÁáÂâ..."

つまり、ひもを 2 つに分割し、半分を一緒に圧縮します。

私は単純に試しましたzip(a, b)が、これはうまくいきませんでした。これはユニコードの問題によるものだと思います。

私が望む結果を得る方法を知っている人はいますか?

4

4 に答える 4

5

Python 2.x では、文字列はデフォルトで Unicode ではありません。Unicode データを扱うときは、次のことを行う必要があります。

  • 文字列リテラルのプレフィックスu: a = u'ÀÁÂÃÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜ'、または

  • プレフィックスを避けたいu場合、および使用しているモジュールに十分な互換性がある場合は、インポートを使用from __future__ import unicode_literalsして、文字列リテラルをデフォルトで Unicode として解釈するようにします。

  • Unicode 文字列リテラルを Python コードに直接記述する場合は、リテラルが正しく解釈される形式で .py ファイルを保存してください。utf-8Python 2.3+ はutf-8 BOMを解釈します。、または_ # -*- coding: utf-8 -*-_

  • .py ファイルを に保存し続けることもできますが、リテラル内の Unicode 文字asciiをエスケープする必要があるため、読みにくくなる可能性があります。'ÀÁÂÃ''\xc0\xc1\xc2\xc3'

これらの条件を満たせば、残りは、str バージョンで作業するのと同じ方法で、これらの Unicode 文字列にアルゴリズムを適用することです。__future__インポートに関する問題の解決策の 1 つを次に示します。

from __future__ import unicode_literals

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

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

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

さらなる参考文献:

  • PEP 263は非 ASCII エンコーディング コメントを定義します
  • PEP 3120は、Python 3 のデフォルトのエンコーディングとして utf-8 を定義しています
于 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
ÀàÁáÂâÃãÈäÉèÊéËçÌêÍëÎìÏíÒîÓïÔòÕóÖôÙõÚöÛùÜú

ただし、「a」文字列にペアがないため、zip メソッドでは残りの「b」文字列が得られないことに注意してください。

于 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 に答える