首页 > 解决方案 > 如果后续列表的值匹配,则合并子列表

问题描述

我有两个输入的不规则列表列表。一个包含某些节点的 z 坐标,另一个包含节点的相应 id,如下所示:

z   = [[0,0,0],[2,2,2],[0,0],[3],[4,4],[4,4],[4,4],[0,0]] #z_coordinates per node
ids = [[1,2,3],[11,12,13],[4,5],[9],[20,21],[41,42],[15,16],[33,34]] #id per node

我想要做的是合并z的行,当值相等并返回相应的(合并的)ids时,所需的输出将是:

z_merged   = [[0,0,0,0,0,0,0],[2,2,2],[3],[4,4,4,4,4,4]]
ids_merged = [[1,2,3,4,5,33,34],[11,12,13],[9],[20,21,15,16,41,42]]

到目前为止我尝试的是对列表进行排序,并检查前一个子列表的第一个值是否与当前子列表的第一个值对应。这将返回正确的索引:

z = sorted(z)
index = []
for i in range(1, len(z)):
    if z[i-1][0] == z[i][0]:
        index.append(i-1)
        index.append(i)
        
index = np.unique(index)
index

所以我现在知道排序的 z 列表,我需要合并子列表 0,1,2 和 5,6,7。但是我坚持弄清楚如何实际合并它们。有任何想法吗?

标签: pythonlist

解决方案


这是使用默认字典进行合并的一种方法。步骤说明 -

  1. 首先是从z和ids的zip中获取key、value。所以首先,key 是 0,value 是 [1,2,3]
  2. 初始化默认字典
  3. 对于给定的键,将列表 v 中的每个元素附加到默认字典。打印此以获得更多详细信息!
  4. 我合并的 id 只是这个字典的值!
  5. 合并后的 z 有点复杂。您必须使用默认的 dict 键重新生成 z,并将其重复到 ids_merged 中每个元素的长度。
from collections import defaultdict

z   = [0,0,0],[2,2,2],[0,0],[3],[4,4],[4,4],[4,4],[0,0]
ids = [1,2,3],[11,12,13],[4,5],[9],[20,21],[41,42],[15,16],[33,34]

dicts = [(j[0],i) for i,j in zip(ids, z)]

d = defaultdict(list)

for k,v in dicts:
    for j in v:
        d[k].append(j)
      
ids_merged = list(d.values())

z_merged = [[list(d.keys())[i]]*len(j) for i,j in enumerate(ids_merged)]

print(z_merged)
print(ids_merged)
[[0, 0, 0, 0, 0, 0, 0], [2, 2, 2], [3], [4, 4, 4, 4, 4, 4]]
[[1, 2, 3, 4, 5, 33, 34], [11, 12, 13], [9], [20, 21, 41, 42, 15, 16]]

推荐阅读