[英]Split a list of dictionary if the value is empty?
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'}]]
我嘗試使用循環,如果和它的工作正常。
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 :
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
這將為您提供相同的輸出:
In [9]: list(grp(l))
Out[9]:
[[{'k': 'a'}, {'k': 'b'}, {'k': ''}],
[{'k': 'd'}, {'k': ''}],
[{'k': 'f'}, {'k': 'g'}]]
生成器功能是迄今為止最有效的方法。
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
這是另一種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'}]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.