Python从序列中选择k个不重复元素

集合中的元素不允许重复,Python集合的内部实现为此做了大量相应的优化,判断集合中是否包含某元素时比列表速度快很多。下面的代码用于返回指定范围内一定数量的不重复数字,使用集合的效率明显优于使用列表。

import random
import time
def RandomNumbers1(number, start, end):
 '''使用列表来生成number个介于start和end之间的不重复随机数'''
    data = []
 while True:
        element = random.randint(start, end)
 if element not in data:
            data.append(element)
 if len(data) == number:
  break
 return data
def RandomNumbers2(number, start, end):
 '''使用集合来生成number个介于start和end之间的不重复随机数'''
    data = set()
 while True:
        element = random.randint(start, end)
        data.add(element)
 if len(data) == number:
 return data
start = time.time()
for i in range(10000):
    d1 = RandomNumbers1(500, 1, 10000)
print('Time used:', time.time()-start)
start = time.time()
for i in range(10000):
    d2 = RandomNumbers2(500, 1, 10000)
print('Time used:', time.time()-start)

运行结果为:

Time used: 41.77738952636719
Time used: 13.330762386322021

上面的代码只是为了展示Python获取不重复元素的原理,如果在项目中需要这样一个功能的时候,还是直接使用下面的方法更好一些,random模块的sample()方法可以直接从指定序列中选取指定数量个不重复的元素

>>> import random
>>> random.sample(range(1000), 20)
[61, 538, 873, 815, 708, 609, 995, 64, 7, 719, 922, 859, 807, 464, 789, 651, 31, 702, 504, 25]

留个思考题:我给学生讲这段代码的时候,有同学修改参数进行调用,例如RandomNumbers2(500, 1, 100),结果导致死循环。你能想到原因吗?

原文发布于微信公众号 - Python小屋(Python_xiaowu)

原文发表时间:2016-09-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏决胜机器学习

从机器学习学python(一) ——numpy中的shape、tile、argsort

从机器学习学python(一)——numpy中的shape、tile、argsort (原创内容,转载请注明来源,谢谢) 注:本系列是我在学习机器学习过程中,...

40840
来自专栏kalifaの日々

C++构造无向图&求最短路径源码

用vector<edge> es[MAX]表示点,每个点队列里放着点的相邻边和到边的距离。 以下源码经过测试可运行 #include <iostream> #i...

33150
来自专栏云霄雨霁

排序----选择排序

17000
来自专栏西枫里博客

Python学习笔记十(lambda表达式)

lambda是一个表达式,并不像def一样定义一个复杂的函数,很简洁的一个代码块。通常被用来创建匿名函数。lambda的好处也很明显,首先省去了函数的定义过程,...

9220
来自专栏数据结构与算法

P1182 数列分段Section II

题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小。 关于最大值最小: 例如一数列4 2 4...

28580
来自专栏生信小驿站

R语言字符串处理①R语言字符串合并与拆分

30020
来自专栏kalifaの日々

POJ2431-最优队列(最小堆)解法

这道题有一个坑,就是给出的加油站到终点的距离不一定是降序排列好了的。 所以得到input之后要先对数据进行排序。我直接用了#include<algorithm>...

36370
来自专栏搞前端的李蚊子

JS使用循环按指定倍数分割数组组成新的数组的方法

 今天一个新人同事问了我一个问题,就是有一个像下边这种不知道具体长度的数组,想以每4个为一组,重新组合为一个二维数组,很简单的需求只需要用到一个循环再去取余数就...

48170
来自专栏TungHsu

这或许是对小白最友好的python入门了吧——16,输入文本

大部分时候我们需要的数值元素等都不是给定的,而是需要用户输入的,我们应该怎么做呢? 这个是时候我们就要用input这个函数: score = input("输入...

28060
来自专栏ACM算法日常

leetcode题解 | 78. 子集

这个题目很容易想到使用DFS的方式来解决,因为组合的题容易产生转移方程,这样也是没有什么问题的。

17430

扫码关注云+社区

领取腾讯云代金券