在 python 列表中抓取唯一的元组,不管顺序如何

新手上路,请多包涵

我有一个 python 列表:

 [ (2,2),(2,3),(1,4),(2,2), etc...]

我需要的是某种将其简化为其独特组件的功能……在上面的列表中:

 [ (2,2),(2,3),(1,4) ]


numpy unique 并不能完全做到这一点。我可以想办法做到这一点——将我的元组转换为数字, [22,23,14,etc.] ,找到唯一性,然后从那里开始工作……但我不知道复杂性是否不会得到不可收拾。有没有一个函数可以完成我想用元组做的事情?


以下是演示该问题的代码示例:

  import numpy as np

 x = [(2,2),(2,2),(2,3)]
 y = np.unique(x)

回报:y:[2 3]

下面是演示修复的解决方案的实现:

  x = [(2,2),(2,2),(2,3)]
 y = list(set(x))

返回 y:[(2,2),(2,3)]

原文由 Chris 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 344
2 个回答

你可以简单地做

y = np.unique(x, axis=0)
z = []
for i in y:
   z.append(tuple(i))

原因是 numpy 将元组列表解释为二维数组。通过设置 axis=0,您会要求 numpy 不要展平数组并返回唯一行。

原文由 Mehdi Golari 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果顺序无关紧要

如果结果的顺序不重要,您可以将列表转换为集合(因为元组是可散列的)并将集合转换回列表:

 >>> l = [(2,2),(2,3),(1,4),(2,2)]
>>> list(set(l))
[(2, 3), (1, 4), (2, 2)]

如果订单很重要

(更新)

从 CPython 3.6(或任何 Python 3.7 版本)开始,常规词典会记住它们的插入顺序,因此您可以简单地发出。

 >>> l = [(2,2),(2,3),(1,4),(2,2)]
>>> list(dict.fromkeys(l))
[(2, 2), (2, 3), (1, 4)]


(旧答案)

如果顺序很重要,则过滤重复项的规范方法是:

 >>> seen = set()
>>> result = []
>>> for item in l:
...     if item not in seen:
...         seen.add(item)
...         result.append(item)
...
>>> result
[(2, 2), (2, 3), (1, 4)]

最后,稍微慢一点,更 hackish,你可以滥用 OrderedDict 作为有序集:

 >>> from collections import OrderedDict
>>> OrderedDict.fromkeys(l).keys() # or list(OrderedDict.fromkeys(l)) if using a version where keys() does not return a list
[(2, 2), (2, 3), (1, 4)]

原文由 timgeb 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题