2016-08-17 4 views
1

辞書のリストを分割してif the value is emptyとし、リストの新しいリストを作成したいと思います。値が空であればディクショナリのリストを分割しますか?

入力:

[{'k':'a'},{'k':'b'},{'k':''},{'k':'d'},{'k':''},{'k':'f'},{'k':'g'}] 

出力:

[[{'k': 'a'}, {'k': 'b'}, {'k': ''}], [{'k': 'd'}, {'k': ''}], [{'k': 'f'}, {'k': 'g'}]] 

場合、その作業罰金Iは、ループを使用して試してみました。

sub_header_list = [{'k':'a'},{'k':'b'},{'k':''},{'k':'d'},{'k':''},{'k':'f'},{'k':'g'}] 
index_data = [] ; data_list = [] 
for i in sub_header_list: 
    index_data.append(i) 
    if i['k'] == '': 
     data_list.append(index_data) 
     index_data = [] 
print(data_list+[index_data]) 

[[{'k': 'a'}, {'k': 'b'}, {'k': ''}], [{'k': 'd'}, {'k': ''}], [{'k': 'f'}, {'k': 'g'}]] 

同じ目的を達成するためにはどのようなpythonic方法がありますか?つまり、組み込み関数などを使用していますか?

あなたが groupby使用することができます
+0

元のデータはどこから来るのでしょうか? –

+0

それ以外の場合は、forループを関数に移動する必要があります。 –

+0

元のデータがデータフレームから来て、私は辞書を作成していますが、私は既に元のデータで回避していますが、それは役に立ちません。 –

答えて

2

このことを行うための別のPython的な方法は次のとおりです。

>>> d = [{'k':'a'}, {'k':'b'}, {'k':''}, {'k':'d'}, {'k':''}, {'k':'f'}, {'k':'g'}] 
>>> index_list = [i + 1 for i, x in enumerate(d) if x == {'k': ''}] 
>>> [d[i:j] for i, j in zip([0] + index_list, index_list + [len(d)])] 
[[{'k': 'a'}, {'k': 'b'}, {'k': ''}], [{'k': 'd'}, {'k': ''}], [{'k': 'f'}, {'k': 'g'}]] 
+1

あなたの答えをUpvoted、ありがとう:) –

2

from itertools import groupby, chain 


l = [{'k':'a'},{'k':'b'},{'k':''},{'k':'d'},{'k':''},{'k':'f'},{'k':'g'}] 

grps = groupby(l, lambda d: d["k"] == "") 

print([list(chain(*(v, next(grps, [[], []])[1]))) for k, v in grps if k]) 

出力:

[[{'k': 'a'}, {'k': 'b'}, {'k': ''}], [{'k': 'd'}, {'k': ''}], [{'k': 'f'}, {'k': 'g'}]] 

または発電機の機能を使用します。

def grp(lst,): 
    temp = [] 
    for dct in lst: 
     # would catch None, 0, for just empty strings use if dct["k"] == "". 
     if not dct["k"]: 
      temp.append(dct) 
      yield temp 
      temp = [] 
     else: 
      temp.append(dct) 
    yield temp 

あなたに同じ出力が得られます。

を3210

ジェネレータ機能は、これまでのところ最も効率的な方法です。

In [8]: l = [{'k':'a'}, {'k':'b'}, {'k':''}, {'k':'d'}, {'k':''}, {'k':'f'}, {'k':'g'}] 

In [9]: l = [dict(choice(l)) for _ in range(100000)] 

In [10]: timeit list(grp(l)) 
10 loops, best of 3: 19.5 ms per loop 

In [11]: %%timeit 
index_list = [i + 1 for i, x in enumerate(l) if x == {'k': ''}] 
[l[i:j] for i, j in zip([0] + index_list, index_list + [len(l)])] 
    ....: 
10 loops, best of 3: 31.6 ms per loop 

In [12]: %%timeit     grps = groupby(l, lambda d: d["k"] == "") 
[list(chain(*(v, next(grps, [[], []])[1]))) for k, v in grps if k] 
    ....: 
10 loops, best of 3: 40 ms per loop 
+1

あなたの答えをアップアップしました:)ありがとう、非常にあなたと@セルクの回答を選択するのは難しい –

+1

いいえ心配、あなたを大歓迎です。 –

関連する問題