【问题标题】:removing duplicate entries from multi-d array in python从python中的多维数组中删除重复条目
【发布时间】:2010-09-29 06:45:28
【问题描述】:

我有一个二维数组

 xx=[[a,1],[b,2],[c,3]]

现在我正在尝试从中删除重复的条目。对于简单的一维数组,简单的代码如

xx=list(set(xx))

会起作用的。但是尝试设置二维元素会出错

temp = set(xx)
TypeError: unhashable type: 'list'

一种解决方法是序列化 xx 个元素,然后对新数组执行 list(set()),然后再次反序列化所有元素。

python有什么解决办法吗?

【问题讨论】:

    标签: python arrays


    【解决方案1】:

    将元素转换为元组,然后使用set

    >>> xx=[['a',1],['b',2],['c',3],['c',3]]
    >>> set(tuple(element) for element in xx)
    set([('a', 1), ('b', 2), ('c', 3)])
    >>> 
    

    元组与列表不同,可以散列。因此。完成后,将元素转换回列表。把所有东西放在一起:

    >>> [list(t) for t in set(tuple(element) for element in xx)]
    [['a', 1], ['b', 2], ['c', 3]]
    

    【讨论】:

    • 不知何故,代码无法删除重复的条目。 set() 无法检测到重复的元组?
    • @Neo:这很有趣。您可以发布一些示例值吗?
    • 字符串和数字可能相同或几乎相同的浮点数?
    • 将代码分解为“for”循环就可以了。对于范围内的 i(len(celeInfo)): celeInfo[i] = tuple(celeInfo[i]) celeInfo = list(set(celeInfo))。请原谅我是脚本新手,您的代码中缺少某些内容。
    • 顺便说一句,cmets 中的一种格式编码如何?我之前的评论看起来很丑:P
    【解决方案2】:

    在 Manoj Govindan 给出出色回答一年后,我将添加我的一条建议:

    如果您想比较事物,浮点数只是一种痛苦......

    例如,

    >>>0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1 == 0.1*10

    错误

    这是因为您的计算机无法将十进制浮点数准确地表示为二进制数(计算机仅处理二进制/以 2 为底的数字,而不是小数/以 10 为底的数字)。

    所以在比较浮点数时要非常小心!

    【讨论】:

      【解决方案3】:

      这是我的解决方案,我特意留下了a[i][0],以便您可以根据需要更改成员。

      ab= [['2.71.122.116', 'test_sys_-fw.test_sys_.us'],
           ['10.10.100.26', 'test_sys_5k1'],
           [None, 'Azure'],
           [None, 'test-server'],
           ['2.71.122.119', 'asa-5506-fw'],
           ['33.151.18.23', 'netscaler1'],
           ['33.151.18.23', 'netscaler2'],
           ['33.151.18.23', 'Palo Alto'],
           ['33.151.18.23', 'Arbor CP'],
           ['44.221.2.100', 'fw-la5515'],
           ['44.221.2.101', 'fw-la2-5515'],
           ['44.221.2.99', 'NexusLA2'],
           ['44.221.2.103', 'ASALA5510'],
           ['2.71.122.120', 'asa-5506-fw2'],
           ['2.71.122.106', '2928_SW2']]
      
      def deduplicate_by_ip(a):
          """
          Clears Empty ip address records from list
          removes duplicates by
          :param a:
          :return:
          """
      
          source_ips = []
          new_list = []
          for i in range(len(a)):
              if a[i][0] != None:
                  if a[i][0] not in source_ips:
                      source_ips.append(a[i][0])
                      new_list.append(a[i])
          return new_list
      
      list = deduplicate_by_ip(ab)
      print("Total items in original list :", len(ab))
      print("Total items after deduplication :", len(list))
      print("The list", list)
      

      【讨论】:

        【解决方案4】:

        如果顺序无关紧要,我相信最简洁的方法(对于代码高尔夫等)是使用内置的maplisttupleextended iterable unpacking 和Python 3.5的additional unpacking generalizations:

        x = [["a", 1], ["b", 2], ["c", 3], ["c", 3], ["a", 1]]
        
        *y,=map(list,{*map(tuple,x)})
        
        print(y)
        

        输出:

        [['a', 1], ['b', 2], ['c', 3]]
        

        See it live

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-12-14
          • 2012-12-14
          • 2013-12-05
          • 1970-01-01
          • 2018-07-26
          • 1970-01-01
          • 2012-01-21
          • 2019-09-04
          相关资源
          最近更新 更多