什么是蟒蛇切片法? [英] What is a pythonic way of slicing a set?

查看:37
本文介绍了什么是蟒蛇切片法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些数据列表,例如:

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

  • 使用dictNone值:

     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.sampleas suggested by jprockbelly

这篇关于什么是蟒蛇切片法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆