10

文字列があり、2文字に分割する必要があります。たとえば、に'ABCDXY'なるはず['AB', 'CD', 'XY']です。文字数が奇数の場合の動作は完全に任意である可能性があります(事前に長さを確認します)。

醜いループなしでこれを行う方法はありますか?

4

6 に答える 6

25
>>> [s[i:i + 2] for i in range(0, len(s), 2)]
['AB', 'CD', 'XY']
于 2012-09-19T09:06:38.853 に答える
16

正規表現を使用する!

>>> import re
>>> s = "ABCDXYv"
>>> re.findall(r'.{1,2}',s,re.DOTALL)
['AB', 'CD', 'XY', 'v']

久しぶりですが、これに戻って、どちらの方法がいいのか気になりました。私の:r'.{1,2}'またはジョンのr'..?'。表面的には、Jonの方がはるかに見栄えが良く、私よりもはるかに高速だと思いましたが、それ以外の方法を見つけて驚いたので、共有したいと思いました。

>>> import timeit
>>> timeit.Timer("re.findall(r'.{1,2}', 'ABCDXYv')", setup='import re').repeat()
[1.9064299485802252, 1.8369554649334674, 1.8548105833383772]
>>> timeit.Timer("re.findall(r'..?', 'ABCDXYv')", setup='import re').repeat()
[1.9142223469651611, 1.8670038395145383, 1.85781945659771]

これは確かにそれr'.{1,2}'がより良い/より速い選択であることを示しています。(しかしほんの少しだけ)

于 2012-09-19T09:11:41.807 に答える
2

あなたは試すことができます:

s = 'ABCDEFG'
r = [s[i:i+2] for i in xrange(0, len(s), 2)]

# r is ['AB', 'CD', 'EF', 'G']

更新2

奇数文字を気にしない場合は、正規表現を使用できます(ループを回避します)。

s = 'ABCDEFG'
r = re.compile('(..)').findall(s)
# r is ['AB', 'CD', 'EF']
于 2012-09-19T09:07:20.863 に答える
1

完全なPythonicについて醜いものは何もありません。

string = 'ABCDXY'
[string[i:i+2] for i in xrange(0, len(string), 2)]

次のものを使用することもできます( -http: //docs.python.org/library/itertools.htmlから):

def grouper(n, iterable, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

(あなたがそれをどのように見るかに応じて-'ループ'を使用している場合と使用していない場合があります;))

または次のようなもの:

re.findall('..?', string)
于 2012-09-19T09:07:46.853 に答える
0

さらに別の解決策、これは上に構築されzip、スライスストライド:

map(''.join, itertools.izip_longest(mystr[::2], mystr[1::2], fillvalue=''))

奇数の長さの入力を処理します。

于 2012-09-19T09:31:43.687 に答える
0

明示的なループのないさらに別の解決策があります(@Emmanuelの答えがあなたの質問に最も適切ですが):

s = 'abcdef'
L = zip(s[::2], s[1::2])
# -> [('a', 'b'), ('c', 'd'), ('e', 'f')]

文字列を取得するには:

print map(''.join, L)
# ['ab', 'cd', 'ef']

Python 3ではlist()、必要に応じてを使用してラップします。

于 2012-09-19T09:31:53.500 に答える