目前,我想找到符合以下要求的正确数据结构。
有多个具有无序元素的数组,例如,
[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
这样的数据结构?
答案 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)))]
答案 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]]