给出以下列表:
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
您可以在此处使用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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。