2014-05-22 33 views
0

我有两个数据集由嵌套列表组成,这些列表中的每个项目看起来像list1[i]= [a, x, y b]list2[j] = [c, x, y, d],并且两个列表的长度不一定匹配。我希望能够通过列表,保留它们的顺序,并消除任何不包含匹配值x的子列表。最后,我想得到两个相同长度的列表,并且对于每个索引,x值在相应的子列表中是相同的。删除数据集中不匹配的项目

现在我有一个假定,list2设定x值的是那些在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()) 

所以基本上我删除,直到他们重新开始匹配,然后在list2去除list1末超越x值(抛出一个异常,如果我剪太不x值相匹配的项目大部分出自list1)。

有没有更好的方法来做到这一点?

我不一定需要放宽当前list2中的所有x值都在list1这一假设,但它会使此代码在将来对其他数据操作更有用。现在我的代码中最大的漏洞是,如果我的list1数据存在差距,我将删除我的整个列表。

+0

这看起来像做什么被通缉在这种情况下,您可能希望查看将列表转换为集合并使用set_diff = set_one.difference(set_two)。 – Tylerflick

+0

@Tylerflick如果OP要保留订单,请不要使用 – jonrsharpe

+0

对于您上面列出的列表@ user47487,您的期望结果如何? – cdhagmann

回答

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]] 
+0

这不适用于我正在使用的列表的结构。 '因为list1和list2中的每一项都是一个子列表本身,我只想匹配每个子列表中的特定值,所以'master_list = [x for list1中的x代表列表2中的x]'返回'[]'。在我上面的例子中,'a!= b'和'c!= d' – JeffP

+0

类似的作品。你不能设置两个列表相等(因为这不是我想要的)。这实现了我想要的: 'list1 = [x for x in list1 if x [1] in zip(* list2)[1]];如果x [1]在zip(* list1)[1]]中,list2 = [x for x in list2]' – JeffP

+0

@ user47487,我很高兴您找到了一个可行的解决方案! – cdhagmann