2013-03-12 17 views
11

私はさまざまな文字列値を含むリストを持っています。私はWORDと表示されるたびにリストを分割したいと思います。結果はリストのリストになります(これは元のリストのサブリストになります)。WORDのインスタンスが1つだけ含まれていますが、ループを使用してこれを行うことができますが、より多くのpythonicの方法がありますか?区切り記号に基づいてリストを分割するPython

例= ['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 

答えて

10

私は発電機を使用します:

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を生成します。

1

@ NPEのソリューションは非常に私にpythonicに見えます。このコードは、主this answerに基づいている

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] 

:これはitertoolsを使用して別のものです。

+0

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

あなたが含まれる区切り文字を主張した場合、これはトリックを行う必要がありますありがとう、私もインデックスに基づいて分割しようとしましたが、それらをペアにする方法はわかりませんでした。これはとても良い方法です。 – Cemre

10
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] 

これは私にはより論理的に見えた、区切り文字なしで分割さリストを作成します。

spl = [[]] 
for x, y in itertools.groupby(lst, lambda z: z == w): 
    if x: spl.append([]) 
    spl[-1].extend(y) 
+1

これは 'itertools'の優れた使い方です。 –

+1

この答えは、組み込みのitertoolsモジュールでは非常に不快なので、この答えを使用することを強くお勧めします! – Drake

+0

delimeterが繰り返されると、残念なことに、2番目のバージョンでは誤った結果が返されます。 –

関連する問題