【问题标题】:removing duplicates from two 2 dimensional list从两个二维列表中删除重复项
【发布时间】:2015-08-10 12:42:59
【问题描述】:

我搜索了一种解决方案,以从 python 中的两个 2d 列表中删除重复项,但我找不到所以这里是我的问题:
例如,我有两个列表

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

[[1,3],[4,4],[3,5],[3,5],[5,6]]

预期结果:

[[1,2],[1,3],[5,7],[5,6]]

我想删除列表中与另一个列表的值完全匹配的列表。

我的脚本:

def filter2dim(firstarray, secondarray):
    unique = []
    for i in range(len(firstarray)):
       temp=firstarray[i]
       for j in range(len(secondarray)):
           if(temp == secondarray[j]):
              break
           elif(j==(len(secondarray)-1)):
               unique.append(temp)
    for i in range(len(secondarray)):
       temp=secondarray[i]
       for j in range(len(firstarray)):
           if(temp == firstarray[j]):
              break
           elif(j==(len(firstarray)-1)):
               unique.append(secondarray[i])
    return 

如果你修复它并解释你做了什么,那就太好了。 谢谢,最好的问候

【问题讨论】:

  • 为什么[1, 2] 不在结果中?
  • 哦,是的,[1,2] 抱歉
  • [5,6] 是如何被纳入骗局的?
  • 保持订单对您来说重要吗?
  • 只是提到我的脚本正在处理小列表,但是当有一个大列表时它会混淆。

标签: list python-3.x unique nested-lists


【解决方案1】:

用元组替换你的2项列表,你可以使用集合操作(​​因为元组是不可变的而列表不是,集合项必须是不可变的):

a = {(1,2),(3,5),(4,4),(5,7)}
b = {(1,3),(4,4),(3,5),(3,5),(5,6)}
print(a.symmetric_difference(b)) # {(1, 2), (5, 7), (5, 6), (1, 3)}

请注意,这也会删除每个列表中的重复项,因为它们是集合,并且顺序被忽略。

如果您需要以编程方式将列表转换为元组,列表推导式就可以了:

list_a = [[1,2],[3,5],[4,4],[5,7]]
set_a = {(i, j) for i, j in list_a}
print(set_a) # {(1, 2), (4, 4), (5, 7), (3, 5)}   

【讨论】:

  • 嗯,对不起,我对 python 不是很熟悉如何将它们转换为元组?
  • @user2597549 刚刚用那个答案编辑了问题。
  • 好的,请给我一些时间来测试一下。谢谢
  • 一个简单的问题,如果第一个列表是空的会导致什么问题吗?
  • 你也这样做,但使用列表而不是集合和元组:list_a = [[i, j] for i, j in set_a]
【解决方案2】:

您的脚本对我来说很好,只需添加:return unique

【讨论】:

  • 是的,我知道,但有时我的列表会混淆 1000 个值
【解决方案3】:

将第一个列表变成dict

a = [[1, 2], [3, 5], [4, 4], [5, 7]]
b = [[1, 3], [4, 4], [3, 5], [3, 5], [5, 6]]

filt = dict(a)
result = [el for el in b if el[0] in filt and el[0] == filt[el[0]]]

或者,将第一个列表变成一组元组,然后检查成员资格:

filt = set(map(tuple, a))
result = [el for el in b if tuple(el) in filt]

这两种解决方案都避免多次遍历第一个列表,因为 dictset 的查找时间为 O(1)。

【讨论】:

  • 我相信Counter 是一种更好的基于哈希表的结构,用于此类事情,即计数:)
猜你喜欢
  • 1970-01-01
  • 2018-05-16
  • 2017-11-06
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
相关资源
最近更新 更多