26

さまざまな文字列値を含むリストがあります。見るたびにリストを分割したいWORDWORD結果は、 I can do this using a loopのインスタンスを 1 つだけ含むリストのリスト (元のリストのサブリストになります) になりますが、これを達成するためのより Pythonicな方法はありますか?

例 =['A', 'WORD', 'B' , 'C' , 'WORD' , 'D']

結果 =[['A'], ['WORD','B','C'],['WORD','D']]

これは私が試したものですが、実際には、WORD必要な別のリストに入れられるため、私が望むものを達成しません:

def split_excel_cells(delimiter, cell_data):

    result = []

    temp = []

    for cell in cell_data:
        if cell == delimiter:
            temp.append(cell)
            result.append(temp)
            temp = []
        else:
            temp.append(cell)

    return result
4

4 に答える 4

37
import itertools

lst = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D']
w = 'WORD'

spl = [list(y) for x, y in itertools.groupby(lst, lambda z: z == w) if not x]

これにより、区切り記号なしで分割されたリストが作成されます。これは、私にとってより論理的に見えます。

[['A'], ['B', 'C'], ['D']]

区切り文字を含めることを主張する場合は、これでうまくいくはずです。

spl = [[]]
for x, y in itertools.groupby(lst, lambda z: z == w):
    if x: spl.append([])
    spl[-1].extend(y)
于 2013-03-12T10:14:18.407 に答える
21

私はジェネレーターを使用します:

def group(seq, sep):
    g = []
    for el in seq:
        if el == sep:
            yield g
            g = []
        g.append(el)
    yield g

ex = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D']
result = list(group(ex, 'WORD'))
print(result)

このプリント

[['A'], ['WORD', 'B', 'C'], ['WORD', 'D']]

このコードは、任意のiterableを受け入れ、iterableを生成します(必要がない場合は、リストにフラット化する必要はありません)

于 2013-03-12T09:54:01.617 に答える
3
  • @NPEのソリューションは、私には非常にpythonicに見えます。これは、次を使用した別のものitertoolsです。
  • izippython 2.7に固有です。Python 3 で動作するようにizip置き換えますzip
from itertools import izip, chain
example = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D']
indices = [i for i,x in enumerate(example) if x=="WORD"]
pairs = izip(chain([0], indices), chain(indices, [None]))
result = [example[i:j] for i, j in pairs]
于 2013-03-12T10:03:13.620 に答える