python - 根据共同的第一个元素合并二维列表中的元素

标签 python python-3.x list optimization merge

给定以下列表:

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 的列表。

感谢您的帮助!

最佳答案

您可以使用 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]]
# Or 
new = [[k,*v] for k,v in new.items()]
# [[3, 5, 10, 15, 102], [5, 21, 23, 50]]

关于python - 根据共同的第一个元素合并二维列表中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60565920/

相关文章:

python -/usr/include/boost/python/detail/wrap_python.hpp :50:23: fatal error: pyconfig. h: 没有那个文件或目录

jquery - 使用 jQuery 将列表项从一个列表复制到另一个列表

python - QSlider 和按键事件

python - 此代码中 `or None` 的用途是什么?

java - 如何在从Python 3.6到Java 1.8 JavaCV的算法转换中找到轮廓

python - 正则表达式替换Python中的列表理解

python - 在条件下追加到字典列表中的嵌套列表

python - 在python中读取在Bayer_rggb8中编码的原始视频的帧

python - 如何将 jupyter notebook 主题重置为默认值?

python-3.x - 在使用 tex 时将 matplotlib pyplot 保存为 pdf