簡體   English   中英

如果值為空,請分割字典列表?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM