【问题标题】:python 2-D list how to make a set [duplicate]python 2-D列表如何制作一组[重复]
【发布时间】:2016-08-22 22:39:40
【问题描述】:

作为python列表跟随

list1 = [[1,2],[3,4],[1,2]]

我想做一个集合,这样我就可以列出唯一的项目,比如

list2 = [[1,2],[3,4]].

python 中是否有一些我可以使用的函数。谢谢

【问题讨论】:

  • list() 是可变类型,不能添加到集合中。您需要将它们转换为元组,然后将它们添加到 set()。
  • 用例是什么?你会更新列表吗?
  • 有趣的是,这个问题得到的答案比所谓的 dupicate 还要多 - 在短短一个小时内。将其标记为重复有什么意义?只是为了阻止人们提出更多的想法?

标签: python


【解决方案1】:

这样就可以了:

>>> list1 = [[1,2],[3,4],[1,2]]
>>> list2 = list(map(list, set(map(tuple,list1))))
>>> list2
[[1, 2], [3, 4]]

【讨论】:

  • 不错的单线。比我的回答好!
  • 为什么是最后一个 list()? map([list, set(map(tuple, a))) 似乎工作正常。
  • @NickM。 map 返回一个迭代器(在 python 3 中)
  • @NickM。为了清楚起见:map 在 Python 3 中返回一个迭代器,但在 Python 2 中返回一个 list
  • 谢谢,我明白了,你的回答很清楚
【解决方案2】:

不幸的是,没有一个内置函数可以处理这个问题。列表是“不可散列的”(参见this SO post)。所以你不能在 Python 中拥有 setlist

但元组可散列的:

l = [[1, 2], [3, 4], [1, 2]]
s = {tuple(x) for x in l}

print(s)

# out: {(1, 2), (3, 4)}

当然,如果您以后想在主数据结构中的这些列表中添加append,这对您没有帮助,因为它们现在都是元组。如果您绝对必须拥有原始列表功能,可以查看this code recipe for uniquification by Tim Peters

【讨论】:

    【解决方案3】:

    请注意,这只会删除重复的子列表,而不会考虑子列表的各个元素。例如:[[1,2,3], [1,2], [1]] -> [[1,2,3], [1,2], [1]]

    >>> print map(list, {tuple(sublist) for sublist in list1})
    [[1, 2], [3, 4]]
    

    【讨论】:

      【解决方案4】:

      你可以试试这个:

      list1 = [[1,2],[3,4],[1,2]]
      list2 = []
      for i in list1:
          if i not in list2:
              list2.append(i)
      print(list2)
      [[1, 2], [3, 4]]
      

      【讨论】:

      • 这对于包含许多独特项目的大型列表会表现不佳,对吗?我不确定精确的算法复杂度是多少,但我认为,随着唯一项的数量接近 n,它会接近 O(n^2)。
      • @PierceDarragh 您可以随时测试性能。我根据您的解决方案检查了它,我的答案更快。
      【解决方案5】:

      最典型的解决方案已经贴出来了,再来一个新的:

      Python 2.x

      list1 = [[1, 2], [3, 4], [1, 2]]
      list2 = {str(v): v for v in list1}.values()
      

      Python 3.x

      list1 = [[1, 2], [3, 4], [1, 2]]
      list2 = list({str(v): v for v in list1}.values())
      

      【讨论】:

      • 旁注:values() 在 Python 3 中不会给出一个列表,而是一个 dict_values 对象
      • @MosesKoledoye 我知道,但 OP 没有指定他使用的是哪个 python 版本(python 标签),所以这是一个完全有效的答案 ;-) 。无论如何,让我编辑
      【解决方案6】:

      没有内置的单一功能来实现这一点。你收到了很多答案。除此之外,您还可以使用lambda 函数来实现:

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

      【讨论】:

      • 作为警告:请不要使用 cmets 要求人们为您的答案投票。我们刚刚删除了其中的 50 多个,它们不过是噪音。
      猜你喜欢
      • 2016-11-08
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      • 2015-07-29
      • 2015-01-03
      • 2017-03-19
      • 2010-12-20
      相关资源
      最近更新 更多