2016-11-22 67 views
-1

我有一些数据列表,例如什么是pythononic切片集的方式?

some_data = [1, 2, 4, 1, 6, 23, 3, 56, 6, 2, 3, 5, 6, 32, 2, 12, 5, 3, 2] 

,我想用固定长度(我不在乎,我会得到)独特的价值观,我也希望它是set对象。

我知道我能做到setsome_data然后使它list,裁剪,然后使其再次set

set(list(set(some_data))[:5]) # don't look so friendly 

我明白,我没有在set__getitem__方法,该方法不会使整个片的事情可能,但如果有一个机会,使它看起来更好?

我完全明白set是无序的。因此,最终set将获得哪些元素无关紧要。

可能的选项是使用:

  • ordered-set
  • 使用dictNone值:

    set(dict(map(lambda x: (x, None), some_data)).keys()[:2]) # not that great 
    
+0

什么是这样做的目的是什么? – jprockbelly

+0

从大的数据列表中获取具有固定长度的'set'对象的目的。然后使用这个集合(检查值是否在'set'中)。 –

回答

3

集是迭代。如果你确实不关心你的集合中的哪些项目被选中,你可以使用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)) 

虽然这是你问什么,我不知道你应该使用它。集合可以以非常确定的顺序进行迭代,因此如果数据通常包含许多类似的值,那么每次执行此操作时最终都会选择一个非常相似的子集。当数据由整数组成时(这在例子中),这对于他们自己来说是非常糟糕的。迭代一个集合时,连续的整数会频繁出现。使用上面的代码,只有32big_set(使用Python 3.5)中出现故障,所以small_set{32, 1, 2, 3, 4}。如果您将0添加到您的数据中,即使数据集数量变大,您几乎总是会以{0, 1, 2, 3, 4}结尾,因为这些值将始终填满该组哈希表中的前五个位置。

为了避免这种确定性采样,您可以使用random.sampleas suggested by jprockbelly

+0

真棒,想到约'islice',但后来我切换到'这需要'__getitem__',然后忘记了'islice' slice'对象。好点子! –

2

你可以品尝一套

import random 
set(random.sample(my_set, 5)) 

这样做的好处,你会每次

+0

相当一个选项,但需要将其转换为'set',我需要运行一些timeit明白,如果它的速度更快。 –

+0

好一点,看编辑 – jprockbelly

+1

以随机抽样是不是会比切片更快。 “random.sample”实现所做的第一件事情之一是将它的参数复制到列表中,如果它是一个集合(然后它从列表中抽样)。无论如何,使用'sample'可能是值得的。这将避免总是你的子集得到相同的值(套可以在非随机顺序重复,例如套连续小整数以便经常)。 – Blckknght

1

得到不同的数字你可以尝试一组简单的理解:

some_data = [1, 2, 4, 1, 6, 23, 3, 56, 6, 2, 3, 5, 6, 32, 2, 12, 5, 3, 2] 
n = {x for i, x in enumerate(set(some_data)) if i < 5} 
print n 

输出:

set([32, 1, 2, 3, 4])

相关问题