【问题标题】:Python: Uniqueness for list of listsPython:列表列表的唯一性
【发布时间】:2011-04-13 01:53:38
【问题描述】:

我很好奇什么是唯一化此类数据对象的有效方法:

testdata =[ ['9034968', 'ETH'], ['14160113', 'ETH'], ['9034968', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15724032', 'ETH'], ['15481740', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['10307528', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['15481740', 'ETH'], ['15379365', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15379365', 'ETH']
]

对于每个数据对,左边的数字字符串加上右边的类型表示数据元素的唯一性。返回值应该是与测试数据相同的列表列表,但只保留唯一值。

【问题讨论】:

    标签: python unique


    【解决方案1】:

    numpy 中使用unique 来解决这个问题:

    import numpy as np
    
    np.unique(np.array(testdata), axis=0)
    

    请注意,axis 关键字需要指定,否则首先将列表展平。

    或者,使用vstack:

    np.vstack({tuple(row) for row in testdata})
    

    【讨论】:

      【解决方案2】:

      如果您有一个对象列表,则可以修改@Mark Byers 的答案:

      unique_data = [list(x) for x in set(tuple(x.testList) for x in testdata)]
      

      其中 testdata 是一个对象列表,其中包含一个列表 testList 作为属性。

      【讨论】:

        【解决方案3】:

        扩展一点@Mark Byers 解决方案,您也可以只做一个列表理解和类型转换来获得您需要的东西:

        testdata = list(set(tuple(x) for x in testdata))
        

        此外,如果您不喜欢列表推导式,因为很多人觉得它们令人困惑,您可以在 for 循环中执行相同操作:

        for i, e in enumerate(testdata):
            testdata[i] = tuple(e)
        testdata = list(set(testdata))
        

        【讨论】:

          【解决方案4】:

          我尝试了@Mark 的回答并得到了一个错误。将列表和每个元素转换为元组使其工作。不确定这是否是最好的方法。

          list(map(list, set(map(lambda i: tuple(i), testdata))))
          

          当然,同样的事情也可以用列表推导式来表达。

          [list(i) for i in set(tuple(i) for i in testdata)]
          

          我使用的是 Python 2.6.2。

          更新

          @Mark 已经改变了他的答案。他当前的答案使用元组并且会起作用。我的也一样:)

          更新 2

          感谢@Mark。我已更改答案以返回列表列表而不是元组列表。

          【讨论】:

          • 这里有个小技巧:你可以写foo,而不是lambda x: foo(x)
          • @Mark:foo 是可调用的。明白了。
          【解决方案5】:
          import sets
          testdata =[ ['9034968', 'ETH'], ['14160113', 'ETH'], ['9034968', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15724032', 'ETH'], ['15481740', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['10307528', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['15481740', 'ETH'], ['15379365', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15379365', 'ETH']]
          conacatData = [x[0] + x[1] for x in testdata]
          print conacatData
          uniqueSet = sets.Set(conacatData)
          uniqueList = [ [t[0:-3], t[-3:]] for t in uniqueSet]
          print uniqueList
          

          【讨论】:

          • 另外,sets 模块已弃用,请改用内置的 set-type。
          【解决方案6】:

          你可以使用一个集合:

          unique_data = [list(x) for x in set(tuple(x) for x in testdata)]
          

          您还可以查看this page,它对各种保持或不保持秩序的方法进行了基准测试。

          【讨论】:

          • 请注意,使用此方法会丢失排序。如果它是相关的,那么您必须在之后对其进行排序或手动删除这些项目。
          • 我收到一个错误:TypeError: unhashable type: 'list'。 Python 2.6.2,Ubuntu Jaunty。
          • @Hellnar:他刚刚更新了代码以使用元组,现在你不会再遇到这个问题了:)
          • @Manoj Govindan:出现问题是因为列表不是可散列的,并且集合中只能使用可散列的类型。我通过转换为元组然后再转换回列表来修复它。可能虽然 OP 应该使用元组列表。
          • @Khan:Python 集合是无序的。这并不意味着您不会从list(some_set) 获得一致的结果,而是意味着您不能以任何方式设置或影响排序顺序。欲了解更多信息:stackoverflow.com/questions/12165200/…
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-22
          相关资源
          最近更新 更多