开发者社区> 问答> 正文

基于共同的第一个元素合并2D列表中的元素

给出以下列表:

lst = [[3,5],[3,10],[3,15],[3,102],[5,21],[5,23],[5,50]]

我想获得以下[[[3,5,10,15,102],[5,21,23,50]]

请注意,列表是根据第一个元素的值以升序排序的。

最有效的方法是什么?这就是我的想法:

第1步:创建具有唯一的第一个元素的列表。(即本例中的3和5)

first_elements = [] #initialize empty list to which we will append all first elements
for i in range(len(lst)):
    first_elements.append(lst[i][0])
first_elements = list(set(first_elements)) #Filter out the unique first elements



    first_elements = [3,5]

步骤2:根据第一个元素过滤lst。将这些附加到新列表。

new_merged_list = [] # create new list to append to
for i in range(len(first_elements)): 
    first_element_to_filter_by = first_elements[i]
    filtered_2d_list           = [i for i in lst if i[0] == first_element_to_filter_by]
    new_merged_list.append([first_element_to_filter_by])

    for j in range(len(filtered_2d_list)):
        (new_merged_list[i]).append(filtered_2d_list[j][1])    

如下所示,这是正确的返回值。

new_merged_list = [[3, 5, 10, 15, 102], [5, 21, 23, 50]]

我的问题-有更有效的方法吗?我不知道将其优化到(例如)100000 x 2的列表的程度。

感谢帮助!

问题来源:stackoverflow

展开
收起
is大龙 2020-03-24 21:42:40 521 0
1 条回答
写回答
取消 提交回答
  • 您可以在此处使用defaultdict。即使您的lst没有排序,它也将起作用。

    from collections import defaultdict
    new=defaultdict(list)
    lst = [[3,5],[3,10],[3,15],[3,102],[5,21],[5,23],[5,50]]
    
    for k,v in lst:
        new[k].append(v)
    
    new=[[k]+v for k,v in new.items()]
    # [[3, 5, 10, 15, 102], [5, 21, 23, 50]]
    

    回答来源:stackoverflow

    2020-03-24 21:42:46
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载