【问题标题】:How can I merge a chain of intersecting 2-D lists (list of of lists) into a single 2-D list of lists如何将相交的二维列表链(列表列表)合并到单个二维列表列表中
【发布时间】:2021-10-25 01:49:38
【问题描述】:

我不得不第三次编辑这个问题并尽可能简单地呈现数据。我想最后一个似乎很难识别模式。这是我现在拥有的,看起来更像第一个,@Andrej 提供了一个解决方案,但我无法适应我的场景。我想这将取决于他的合并条件。 original 数据是 3D 的,如下所示。`

original = [
            [[0,1],[2,3],[4,5]], 
            [[0,1],[4,5]], 
            [[2,3]], 
            [[6,7],[8,9],[10,11]], 
            [[8,9],[6,7]], 
            [[6,7],[10,11]], 
            [[16,17],[12,13],[14,15]], 
            [[12,13]], 
            [[14,15],[16,17],[18,19]]
            [[12,13],[16,17],[20,21]]
           ]   
`

从给定的数据中,我想获得另一个 3-D merged 数据`

merged = [
          [[0,1],[2,3],[4,5]], 
          [[6,7],[8,9],[10,11]], 
          [[12,13],[14,15],[16,17],[18,19],[20,21]]
         ]

。我需要遍历所有二维列表并将所有二维列表与常见的一维内部列表合并,同时删除任何重复的一维列表。更像是查找具有相交列表的二维列表,然后合并所有此类二维列表。根据给定的original 数据,第一个二维列表通过[0,1],[4,5] 与第二个列表相交,而第三个二维列表通过[2,3] 与第一个二维列表相交。所有三个二维列表一起通过它们相交的一维列表形成一个连接链。该链应合并到所有三个二维列表的联合中,即[[0,1],[2,3],[4,5]]。我已经尝试了下面的示例代码:

import numpy as np
        
original = [
        [[0, 1], [2, 3], [4, 5]], 
        [[0, 1], [4, 5]], 
        [[2, 3]], 
        [[6, 7], [8, 9], [10, 11]], 
        [[8, 9], [6, 7]], 
        [[6, 7], [10, 11]], 
        [[16, 17], [12, 13], [14, 15]], 
        [[12, 13]], 
        [[14, 15], [16, 17], [18, 19]],
        [[12, 13], [16, 17], [20, 21]]
       ] 
    
        
    tmp = {}
    for subl in original:
        for a, b in subl:
            tmp.setdefault(a, set()).add(b)
    
    merged = []
    for k, v in tmp.items():
        out.append([[k, i] for i in v])
    
    print(merged)

但这并没有给出上面给出的预期合并数据,而是:[[[0, 0], [0, 1], [0, 2], [0, 3], [0, 4]], [[1, 0], [1, 1], [1, 2]], [[2, 0], [2, 1], [2, 2], [2, 3], [2, 4]]]。任何帮助将不胜感激。

【问题讨论】:

  • 我不认为我理解这个问题。什么规则告诉您您的示例 merged 是您的示例 original 的正确输出?模式是什么? 似乎您正在尝试根据第一个值对最里面的列表(值对)进行分组,并删除重复项。但在那种情况下,我不明白你为什么要以这种方式构造数据。从(第一个值)到(可能的第二个值的列表)的简单 dict 映射似乎更简单。
  • 实际上那些最里面的列表是分布在二维平面上的不同点的 (x,y) 坐标。规则是merged 最外层列表应该只合并包含相同列表/坐标的列表列表并消除重复列表/坐标,以便列表的每个内部列表中只存在一个列表/坐标的单个实例。然后以某种方式安排以显示一些优势或下降

标签: python list arraylist


【解决方案1】:

试试:

original = [
    [[0, 0], [0, 1], [0, 2], [0, 3], [0, 4]],
    [[0, 1], [0, 2], [0, 3], [0, 4], [0, 5]],
    [[0, 2], [0, 3], [0, 5]],
    [[1, 0], [1, 2], [1, 4]],
    [[1, 2], [1, 3], [1, 4]],
    [[1, 0], [1, 2], [1, 3], [1, 4]],
    [[1, 0]],
    [[1, 0], [1, 3]],
    [[2, 0], [2, 1], [2, 2], [2, 3]],
    [[2, 1], [2, 2], [2, 3], [2, 4]],
    [[2, 2], [2, 3], [2, 4]],
    [[2, 3], [2, 4]],
    [[2, 4]],
]


tmp = {}
for subl in original:
    for a, b in subl:
        tmp.setdefault(a, set()).add(b)

out = []
for k, v in tmp.items():
    out.append([[k, i] for i in v])

print(out)

打印:

[
    [[0, 0], [0, 1], [0, 2], [0, 3], [0, 4], [0, 5]],
    [[1, 0], [1, 2], [1, 3], [1, 4]],
    [[2, 0], [2, 1], [2, 2], [2, 3], [2, 4]],
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 2021-08-06
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多