2

私の言語はパイソンです

入力は次のようになります。

'0 0 0 0 1 0 0 0 1 1 0 0' 

等々。

私は出力が欲しい:

('0 0 0 0', '1 0 0 0', '1 1 0 0') 

または の 4 つの数字のすべてのセットが独自の要素です

これまで私はまとめました

>>> truth = re.compile('(([0-1]\D*?){4})*')
>>> truth.search('0 0 0 0 1 0 0 0').groups()
('0 0 0 0', '0')

または、いくつかの同様のものがありますが、何も近づいていません。ここにあるいくつかのことは私にとって新しいものであり、ドキュメントを読んでいますが、バラバラになっているものをつなぎ合わせることができないようです. 注目すべきは、最後の0を取得する理由がわかりません...

入力は最終的には多くの行になりますが、小さなケースで機能する場合は、翻訳されると確信しています。

ありがとう

4

5 に答える 5

6

これには正規表現を使用しません。代わりにitertools ドキュメントのレシピgrouperから使用してください:

>>> [' '.join(x) for x in grouper(4, truth.split())]

オンラインでの動作を確認してください: ideone


のソースコードは次のとおりですgrouper(itertoolsのドキュメントからコピー):

from itertools import izip_longest

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)
于 2012-05-12T06:25:27.947 に答える
3

私はPythonにあまり精通していませんが、正規表現を少し変更してre.findall()代わりに使用することができます。

re.findall('(?:[0-1]\s*){4}', '0 0 0 0 1 0 0 0 1 1 0 0')
于 2012-05-12T06:29:48.173 に答える
1

これはそれを行います:

>>> s='0 0 0 0 1 0 0 0 1 1 0 0' 
>>> [' '.join(x) for x in zip(*[iter(''.join(s.split()))]*4)]
['0 0 0 0', '1 0 0 0', '1 1 0 0']

タプルが必要な場合:

>>> tuple(' '.join(x) for x in zip(*[iter(''.join(s.split()))]*4))
('0 0 0 0', '1 0 0 0', '1 1 0 0')

本当に正規表現が必要な場合:

>>> [x.strip() for x in re.findall(r'(?:\d\s*){4}',s)]
['0 0 0 0', '1 0 0 0', '1 1 0 0']
于 2012-05-12T07:09:31.567 に答える
1

リスト内包表記をチェックアウトする必要があります:

>>> MyString = '0 0 0 0 1 0 0 0 1 1 0 0'
>>> [MyString[x:x+7] for x in range(0,len(MyString),8)]
>>> ['0 0 0 0', '1 0 0 0', '1 1 0 0']
于 2012-05-12T06:25:17.167 に答える
0

楽しみのためだけのクレイジーなソリューション:

import math
s = '0 0 0 0 1 0 0 0 1 1 0 0'
step = 8
result = [s[0+i*step:step+i*step] for i in xrange(int(math.ceil(float(len(s))/step)))]
print result
于 2012-05-12T08:23:05.743 に答える