[英]Python: how to split a list into an unknown number of smaller lists based on a delimeter
[英]How to split a list into smaller lists python
我有一個嵌套列表,看起來像:
lst = [['ID1', 'A'],['ID1','B'],['ID2','AAA'], ['ID2','DDD']...]
我是否可以通過它們的ID
將lst
拆分為小列表,以便每個小列表包含具有相同ID
元素? 結果應該如下所示:
lst1 = [['ID1', 'A'], ['ID1', 'B']...]
lst2 = [['ID2', 'AAA'], ['ID2', 'DDD']...]
您可以使用groupby
:
from itertools import groupby
grp_lists = []
for i, grp in groupby(lst, key= lambda x: x[0]):
grp_lists.append(list(grp))
print(grp_lists[0])
[['ID1', 'A'], ['ID1', 'B']]
print(grp_lists[1])
[['ID2', 'AAA'], ['ID2', 'DDD']]
使用 collections.defaultdict:
lst = [['ID1', 'A'],['ID1','B'],['ID2','AAA'], ['ID2','DDD']]
from collections import defaultdict
result = defaultdict(list)
for item in lst:
result[item[0]].append(item)
print(list(result.values()))
輸出:
[[['ID1', 'A'], ['ID1', 'B']], [['ID2', 'AAA'], ['ID2', 'DDD']]]
沒有外部函數:構建一組唯一索引,然后循環遍歷原始列表,為每個索引構建一個新列表,並用包含該索引的列表項填充它:
lst = [['ID1', 'A'],['ID1','B'],['ID2','AAA'], ['ID2','DDD']]
unique_set = set(elem[0] for elem in lst)
lst2 = [ [elem for elem in lst if elem[0] in every_unique] for every_unique in unique_set]
print (lst2)
結果:
[[['ID2', 'AAA'], ['ID2', 'DDD']], [['ID1', 'A'], ['ID1', 'B']]]
(可以將unique_set
移動到最后一行,使其成為單行。但這會使發生的事情不太清楚。)
如果您想獲得單獨的變量,例如您的結果示例:
lst1 = [sub_lst for sub_lst in lst if sub_lst[0] == 'ID1']
和
lst2 = [sub_lst for sub_lst in lst if sub_lst[0] == 'ID2']
從中,您可以創建一個函數:
def create_sub_list(id_str, original_lst):
return [x for x in original_lst if x[0] == id_str]
並這樣稱呼它:
lst1 = create_sub_list('ID1', lst)
如果你想要一個子列表的字典,為了更容易訪問,你可以使用:
from functools import reduce
def reduce_dict(ret_dict, sub_lst):
if (sub_lst[0] not in ret_dict):
ret_dict[sub_lst[0]] = sub_lst[1:]
else:
ret_dict[sub_lst[0]] += sub_lst[1:]
return ret_dict
grouped_dict = reduce(reduce_dict, lst, dict())
(如果您知道在您的列表中每個 ID 槽后只有 1 個字符串,您可以將sub_lst[1:]
更改為sub_lst[1]
)
然后訪問元素,如果您使用 ID 字符串的字典:
print(grouped_dict['ID1'])
這將打印:
['A', 'B']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.