什么是pythononic切片组的方式?

vis*_*ell 1 python set

例如,我有一些数据列表

some_data = [1, 2, 4, 1, 6, 23, 3, 56, 6, 2, 3, 5, 6, 32, 2, 12, 5, 3, 2]
Run Code Online (Sandbox Code Playgroud)

我想得到固定长度的唯一值(我不关心我会得到),我也希望它是set对象.

我知道我可以做到set,some_data然后再做它list,然后重新制作它set.

set(list(set(some_data))[:5])  # don't look so friendly
Run Code Online (Sandbox Code Playgroud)

我知道我没有__getitem__方法set可以使整个切片成为可能,但是如果有机会让它看起来更好吗?

我完全理解这set是无序的.所以哪个元素最终会变得无关紧要set.

可能的选择是使用:

Blc*_*ght 9

集是可迭代的.如果你真的不关心你的集合中的哪些项目被选中,你可以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))
Run Code Online (Sandbox Code Playgroud)

虽然这是你要求的,但我不确定你应该真的使用它.集合可以以非常确定的顺序迭代,因此如果您的数据通常包含许多相似的值,则每次执行此操作时最终可能会选择一个非常相似的子集.当数据由整数(如示例中)组成时,这尤其糟糕,它们对自身进行散列.在迭代集合时,连续的整数将经常按顺序出现.与上面的代码,仅32是不按顺序在big_set(使用Python 3.5),所以small_set{32, 1, 2, 3, 4}.如果您添加0到您的数据中,{0, 1, 2, 3, 4}即使数据集变得庞大,您也几乎总是会结束,因为这些值将始终填满集合哈希表中的前五个插槽.

为避免这种确定性采样,您可以random.sample 按照jprockbelly的建议使用.


jpr*_*lly 6

你可以采样集合

import random
set(random.sample(my_set, 5)) 
Run Code Online (Sandbox Code Playgroud)

这样做的好处是你每次都会得到不同的数字