我有一些数据列表,例如:
some_data = [1, 2, 4, 1, 6, 23, 3, 56, 6, 2, 3, 5, 6, 32, 2, 12, 5, 3, 2]
并且我希望获得固定长度的唯一值(我不在乎将获得哪个值),并且我还希望它是set
。
我知道我可以从some_data
执行set
,然后使其list
,裁剪它,然后再次使其set
。
set(list(set(some_data))[:5]) # doesn't look so friendly
我知道我在set
中没有__getitem__
方法,这不会使整个切片成为可能,但是是否有机会使它看起来更好?
我完全理解set
是无序的。因此,最终set
中包含哪些元素并不重要。
可以选择使用:
ordered-set
使用dict
和None
值:
set(dict(map(lambda x: (x, None), some_data)).keys()[:2]) # not that great
集合是可迭代的。如果您真的不在乎从您的集合中选择了哪些项目,您可以使用itertools.islice
来获取一个迭代器,该迭代器将产生指定数量的项目(无论哪个项目在迭代顺序中排在第一位)。将迭代器传递给set
构造函数,即可在不使用任何额外列表的情况下获得子集:
import itertools
some_data = [1, 2, 4, 1, 6, 23, 3, 56, 6, 2, 3, 5, 6, 32, 2, 12, 5, 3, 2]
big_set = set(some_data)
small_set = set(itertools.islice(big_set, 5))
虽然这是您要求的,但我不确定您是否真的应该使用它。集合可能会以非常确定的顺序迭代,因此如果您的数据经常包含许多相似的值,那么每次执行此操作时,您可能最终都会选择一个非常相似的子集。当数据由整数组成时(如本例所示),这一点尤其糟糕,因为整数本身是散列的。迭代集合时,连续整数将非常频繁地按顺序出现。在上面的代码中,big_set
(使用Python3.5)中只有32
是乱序的,所以small_set
是{32, 1, 2, 3, 4}
。如果将0
添加到数据中,即使数据集变得很大,最终结果也几乎总是{0, 1, 2, 3, 4}
,因为这些值总是会填满集合哈希表中的前五个槽。
要避免这种确定性采样,您可以使用random.sample
as suggested by jprockbelly。
这篇关于什么是蟒蛇切片法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!