1

を介してリストに押し込まれた一連の文字列がありますlist(string)

stringy = "I've 24got a 697love-a-ly2 bunch of 000coconuts!"
listy = list(stringy)

listyのようになります。

['I', "'", 'v', 'e', ' ', '2', '4', 'g', 'o', 't', ' ', 'a', ' ', '6', '9'...

リストを繰り返し処理し、個々の文字エントリを破棄せずに、すべての整数を結合して生成するよりクリーンな方法を探しています。

['I', "'", 'v', 'e', ' ', '24', 'g', 'o', 't', ' ', 'a', ' ', '697','l','o'...

整数が文字列のどこにあるかは予測できず、数値の桁数も予測できません (1 または 1000000000 に遭遇する可能性があります)。

最初に整数値を見つけるには、次のようなことを考えました。

for i in listy:
    if i.isdigit():
        x = listy.index(i)
        z = listy[x+1]
        if z.isdigit():

...しかし、それは非効率な血まみれの混乱になるでしょう。

実際に数字をまとめるのはとても簡単ですが、それぞれの数字をきちんと確認する方法を考え出すのに苦労しています。助言がありますか?

4

4 に答える 4

10

reを使用して、これを非常に簡単に行うことができます。

>>> import re
>>> a = "I've 24got a 697love-a-ly2 bunch of 000coconuts!"
>>> re.findall(r'\d+|.', a)
['I', "'", 'v', 'e', ' ', '24', 'g', 'o', 't', ' ', 'a', ' ', '697', 'l', 'o', 'v', 'e', '-', 'a', '-', 'l', 'y', '2', ' ', 'b', 'u', 'n', 'c', 'h', ' ', 'o', 'f', ' ', '000', 'c', 'o', 'c', 'o', 'n', 'u', 't', 's', '!']

この操作を複数回行う場合は、次のようにコンパイルすることを検討する必要があります。

>>> splitter = re.compile(r'\d+|.')
于 2013-05-14T01:24:39.923 に答える
7

私はitertools.groupbyを使用します(免責事項: すべてに使用します..)

>>> from itertools import groupby, count
>>> tick = count()
>>> [''.join(group) for key, group in groupby(sy, lambda c: c.isdigit() or next(tick))]
['I', "'", 'v', 'e', ' ', '24', 'g', 'o', 't', ' ', 'a', ' ', '697', 'l', 'o', 'v', 'e', '-', 'a', '-', 'l', 'y', '2', ' ', 'b', 'u', 'n', 'c', 'h', ' ', 'o', 'f', ' ', '000', 'b', 'a', 'l', 'l', 'o', 'o', 'n', 's', '!']

groupbyキー関数を使用してシーケンスを連続したグループに分割します。この場合、私の keyfunction はc.isdigit() or cで、数字の場合は True を返し、数字以外の場合は文字を返します。ただし、@gnibbler が指摘しているように、隣接する文字を誤ってマージしないように注意する必要があります..

countただし、次のトリックは必要ありません。

>>> from itertools import groupby, chain
>>> gg = ([''.join(group)] if key else list(group) for key, group in groupby(sy, str.isdigit))
>>> list(chain.from_iterable(gg))
['I', "'", 'v', 'e', ' ', '24', 'g', 'o', 't', ' ', 'a', ' ', '697', 'l', 'o', 'v', 'e', '-', 'a', '-', 'l', 'y', '2', ' ', 'b', 'u', 'n', 'c', 'h', ' ', 'o', 'f', ' ', '000', 'b', 'a', 'l', 'l', 'o', 'o', 'n', 's', '!']
于 2013-05-14T01:22:55.120 に答える