我有两个由嵌套列表列表组成的数据集,这样列表中的每个项目都看起来像list1[i]= [a, x, y b]
和list2[j] = [c, x, y, d]
,并且两个列表的长度不一定匹配。我希望能够浏览列表,保留其顺序,并消除任何不包含匹配x
值的子列表。最后,我想得到两个长度相同的列表,每个索引的位置,x
值在相应的子列表中是相同的。
现在我的代码有点混乱,假设x
中的list2
值集合是list1
中的x
的一部分(此时为真),然后继续执行删除 len_diff = len(list1) - len(list2)
if len_diff > 0:
removed = []
for (counter, row) in enumerate(list2):
while list1[counter][1] != list2[counter][1]:
removed.append(list1.pop(counter))
new_len_diff = len(list1) - len(list2)
if new_len_diff < 0:
raise IndexError('Data sets do not completely overlap')
else:
for i in range(new_len_diff):
removed.append(temp_data.pop())
值不匹配的项目。
x
所以基本上我删除任何不匹配list1
值的项目,直到它们再次开始匹配,然后删除x
超出list2
值的结尾在list1
中(如果我从x
切出太多而引发异常。)
有更好的方法吗?
我不一定要放松假设list2
中list1
中的所有{{1}}值目前都在{{1}},但它会使这段代码对我更有用其他数据操作的未来。我代码中最大的漏洞就是如果我的list1数据中存在空白,我将删除整个列表。
答案 0 :(得分:1)
你应该试试这个:
list1 = list2 = [x for x in list1 if x[1] in zip(*list2)[1]]
修改强>
根据以下评论,OP根据需要调整了这个答案
list1 = [x for x in list1 if x[1] in zip(*list2)[1]]
list2 = [x for x in list2 if x[1] in zip(*list1)[1]]