用于表示Python中的集合中的多个等效键的数据结构?

时间:2015-10-13 11:42:20

标签: python data-structures set

目前,我想找到符合以下要求的正确数据结构。

有多个具有无序元素的数组,例如,

[1, 2], [2, 1], [3, 2, 2], [2], [2, 1, 3], [2, 2, 3]

处理完这些数据后,结果是,

[1, 2], [2, 2, 3], [2], [1, 2, 3]

在每个数组中使用sorted元素并过滤重复的数组。

以下是我的想法:

  • 数据结构Set(Arrays)? - 失败了。似乎内置set

    中只有一个数组

    set([])

  • 数据结构Array(Sets)? - 失败了。但是,内置set中没有重复元素。 我想知道Python中的C ++中是否有一个像multiset这样的数据结构?

5 个答案:

答案 0 :(得分:5)

将列表转换为元组(因此可以是集合的项目),然后返回列表。

>>> [list(i) for i in set([tuple(sorted(i)) for i in a])]
[[1, 2], [2], [2, 2, 3], [1, 2, 3]]

答案 1 :(得分:4)

lst = [[1, 2], [2, 1], [3, 2, 2], [2], [2, 1, 3], [2, 2, 3]]
map(list, set(map(tuple, map(sorted, lst)))

输出:

[[1, 2], [2], [2, 2, 3], [1, 2, 3]]

答案 2 :(得分:2)

试试这个:

[list(i) for i in set(map(tuple, a))]

修改 假设list已经排序。感谢@ PM2RING提醒我。 如果没有,那么在

上面添加这一行
a = [sorted(i) for i in a]

再次感谢@ PM2RING:一个班轮

[list(i) for i in set(map(tuple, (sorted(i) for i in a)))]

Demo

答案 3 :(得分:2)

没有Python,没有内置的multiset;标准模块中最接近的等价物是collections.Counter,这是一种字典。计数器可能适合您的需求,但如果没有更多背景,很难说明。


请注意,设置保留添加顺序。如果你需要保留列表的初始顺序,你可以这样做:

data = [[1, 2], [2, 1], [3, 2, 2], [2], [2, 1, 3], [2, 2, 3]]

a = set()
outlist = []
for s in data:
    t = tuple(sorted(s))
    if t not in a:
        a.add(t)
        outlist.append(list(t))

print(outlist)

<强>输出

[[1, 2], [2, 2, 3], [2], [1, 2, 3]]

如果输入列表的数量相当小,则您不需要该集合(以及列表&lt; - &gt;元组转换),只需测试outlist中的成员资格。但是,由于它在列表上执行线性搜索,因此对较大的输入列表无效。

答案 4 :(得分:2)

目前这里的一些解决方案正在破坏订购。我不确定这对您是否重要,但这是一个保留原始订单的版本:

>>> from collections import OrderedDict
>>> A = [[1, 2], [2, 1], [3, 2, 2], [2], [2, 1, 3], [2, 2, 3]]
>>> [list(k) for k in OrderedDict.fromkeys(tuple(sorted(a)) for a in A)]
[[1, 2], [2, 2, 3], [2], [1, 2, 3]]