选择集合中的前n个元素

24

我有一个需要迭代的大型元素 set。出于调试目的, 我只想迭代前面大约10个元素。为了实现这一点,我从我的set初始化了一个list,通过[:10]选择了前10个元素,并迭代了结果list。 有没有更符合Python风格的方法?

mySet = set(df.SomeUniqueId)
myList = list(mySet)[:10]
for i, val in enumerate(myList):
    ...

你能把它强制转换成列表吗?for i, val in enumerate(list(df.SomeUniqueId)[:10]): ... - rma
1
什么是“first”?集合没有顺序,不存在“第一”项10。 - Robᵩ
1
@Robᵩ 好的,说得对,我对集合还很陌生,没有考虑到它们没有顺序这一事实。我想我是从排序列表的角度来看待集合的,并且指的是那个“列表”的前10个元素。 - user95308
4
将“第一个”替换为“任意的”。 :-) - paxdiablo
1
myList = [el for (el, _) in zip(mySet, range(10))] 看起来很不错,它可以在不将整个集合转换为列表的情况下完成操作,并且不需要额外的导入。已在Python 3.8中测试。 - AllanLRH
2个回答

27

我会使用itertools.islice()。对于我来说,生成整个列表只为访问前几个项目似乎是浪费的。

for i, val in enumerate(itertools.islice(mySet, 10)):

编辑:

如果你想要随机选择(与任意地选择相对),你可以尝试使用random.sample()来选择你的十个元素。

for i, val in enumerate(random.sample(mySet, 10)):

1
请注意,当集合中的元素少于请求的元素(例如:<10)时,“islice()”可以正常工作,但“random.sample()”会抛出错误。 - rcoup

3

有很多方法可以做到这一点。使用list(set(a))将创建一个列表,根据您的集合大小可能需要很长时间。但是,由于您只需要迭代少量循环,我会使用迭代器和计数器:

count = 0
for elem in iter(mySet):
    count = count + 1
    if count == 10:
        break
    print elem

这将避免创建长列表的开销,并且手动编写控制循环的代码的开销可能是可以忽略不计的。

7
如果需要超过一行代码,那就不可能符合 Pythonic 的标准了 :-) - paxdiablo
没错。Rob的答案比我的好 :) - Tiago1984
这让我内心的C++程序员想到了,但正如@paxdiablo所说,它并不特别符合Python风格(我正在慢慢地尝试将自己的思维从C++转换到Python!)。 - user95308

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接