【问题标题】:Can a set have lists as its elements? [duplicate]一个集合可以有列表作为它的元素吗? [复制]
【发布时间】:2017-03-10 15:58:12
【问题描述】:

我正在尝试获取包含重复值的唯一列表,我可以使用集合来获取唯一列表吗?

更具体地说,这里是一个例子:

my_list=[[1,2,1],[1,2,2],[1,2,2],[1,1,2],[2,2,2]]

我想要的是:

set_list=[[1,2,1],[1,2,2],[1,1,2],[2,2,2]]

这可能吗? 提前感谢您的友好回复:)

【问题讨论】:

  • 不,列表不可散列...
  • 那我可以用什么来执行此操作?
  • 您可以使用元组而不是列表。

标签: python logic


【解决方案1】:

不,list 不可散列。您将收到以下错误:

TypeError: unhashable type: 'list'

鉴于列表仅包含可散列对象,您可以将列表转换为tuple 并添加元组。所以你可以这样做:

>>> my_list=[[1,2,1],[1,2,2],[1,2,2],[1,1,2],[2,2,2]]
>>> set_tuples = {tuple(a_list) for a_list in my_list}
>>> set_tuples
{(1, 2, 2), (1, 2, 1), (2, 2, 2), (1, 1, 2)}

然后,您可以使用以下方法构建唯一性过滤器:

my_list=[[1,2,1],[1,2,2],[1,2,2],[1,1,2],[2,2,2]]
result = []
unique_set = set()
for sublist in my_list:
    the_tuple = tuple(sublist)
    if the_tuple not in unique_set:
        unique_set.add(the_tuple)
        result.append(sublist)

所以集合上的所有操作都是用元组完成的。这给出了:

>>> result
[[1, 2, 1], [1, 2, 2], [1, 1, 2], [2, 2, 2]]

【讨论】:

  • 好吧,我仍然没有得到想要的结果:/ 我得到了以下结果: for i in my_list: ... the_tuple=tuple(i) ... 如果 the_tuple 不在 unique_set 中:.. . unique_set.add(the_tuple) ... result.append(i) ... >>> unique_set set([((),), ((1,), (2,), (2,)), ( (1, 2), (1, 2), (2, 1), (2, 2), (2, 1), (2, 2))]) >>> 结果 [[(1,), ( 2,), (2,)], [(1, 2), (1, 2), (2, 1), (2, 2), (2, 1), (2, 2)]] >> >
  • @deb:请注意my_list 包含所有列表
  • 我的意思是它仍然在同一个列表中显示重复的列表
  • @deb: 如果你运行最后一个代码片段(它是自包含的),你会得到报告的result...你可能有一个for 太多,因为你的唯一集好像构造单元素元组、二元元组等。
  • 你的意思是把它应用到每个元组上吗?那是先到the_tuple[0]等等..?
【解决方案2】:

列表不可散列,但您可以拥有一组元组:

set(map(tuple, my_list))
# {(1, 1, 2), (1, 2, 1), (1, 2, 2), (2, 2, 2)}

【讨论】:

  • 这仍然显示所有重复值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 2013-05-31
  • 2018-06-23
  • 2023-03-26
相关资源
最近更新 更多