簡體   English   中英

如何將列表拆分為較小的列表python

[英]How to split a list into smaller lists python

我有一個嵌套列表,看起來像:

lst = [['ID1', 'A'],['ID1','B'],['ID2','AAA'], ['ID2','DDD']...]

我是否可以通過它們的IDlst拆分為小列表,以便每個小列表包含具有相同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.

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