python - 如果后续列表的值匹配,则合并子列表
问题描述
我有两个输入的不规则列表列表。一个包含某些节点的 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。但是我坚持弄清楚如何实际合并它们。有任何想法吗?
解决方案
这是使用默认字典进行合并的一种方法。步骤说明 -
- 首先是从z和ids的zip中获取key、value。所以首先,key 是 0,value 是 [1,2,3]
- 初始化默认字典
- 对于给定的键,将列表 v 中的每个元素附加到默认字典。打印此以获得更多详细信息!
- 我合并的 id 只是这个字典的值!
- 合并后的 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]]
推荐阅读
- reactjs - 绑定验证错误表单 net5 api 以响应表单
- xsd - XSD 的 SimpleContent 中文本的默认值
- java - BEAM:ORACLE 连接器:NUMBER 数据类型:非法参数类型异常
- reactjs - React saga 对多个调用给出单一响应
- c++ - 禁用后,此项目需要 Spectre-mitigated 库,给出需要启用的错误
- r - Gtsummary add_difference 用于与 add_p 相同的表中的分类
- python - 如果用户输入触发错误(Python),则返回第二个提示
- gitlab - 如何限制 IP 地址访问 Gitlab 网页?
- javascript - 获取特定的 cookie 并将其分配为变量以在标头中发出进一步的请求
- javascript - 从 POST axios 返回数据