我想生成一组X独特的随机数和Python中对它们进行排序。 例如:范围(1000,10000)X = 100
我已经想通了导入随机并使用random.randrange方法,然后循环得到100张随机数,并最终对它们进行排序。
不过,我不知道如何获得唯一编号(例如,他们不重复) - 我应该验证每一个循环? 还是有其他更简单的方法怎么办呢? 我应该如何对它们进行排序?
谢谢你们!
我想生成一组X独特的随机数和Python中对它们进行排序。 例如:范围(1000,10000)X = 100
我已经想通了导入随机并使用random.randrange方法,然后循环得到100张随机数,并最终对它们进行排序。
不过,我不知道如何获得唯一编号(例如,他们不重复) - 我应该验证每一个循环? 还是有其他更简单的方法怎么办呢? 我应该如何对它们进行排序?
谢谢你们!
使用random.sample
numbers = random.sample(xrange(1000, 10000), 100) # or `range` in Python 3
排序部分很简单-使用list.sort
方法。
numbers.sort()
默认情况下,这会从最小的数字到大排序,但它有一个可选的key
这决定了它排序参数。
还有一个sorted
不修改就地列表功能,而是返回一个排序列表。
numbers_sorted = sorted(numbers)
这也有一个可选的key
参数。
more_itertools
实现random_combinations
itertools配方,它返回r
排序的随机数,如果给定的排序输入。
import more_itertools as mit
mit.random_combination(range(1000, 10000), r=100)
# (1016, 1112, 1233, 1367, 1446, 1460, 1518, 1807, 1832, 1956, ...)
这不像random.sample
,它返回一个未排序的结果。
细节
纵观配方,我们可以看到为什么建立这个顺序。
从itertools食谱 :
def random_combination(iterable, r):
"""Return a random *r* length subsequence of the elements in *iterable*.
>>> random_combination(range(5), 3) # doctest:+SKIP
(2, 3, 4)
This equivalent to taking a random selection from
``itertools.combinations(iterable, r)``.
"""
pool = tuple(iterable)
n = len(pool)
indices = sorted(sample(range(n), r))
return tuple(pool[i] for i in indices)
range()
固有地排序,并成为pool
从中随机元件被选择。 虽然指数是随机选择的,他们后来进行排序。 由于pool
和indices
都进行排序,结果也会分类。
总之,这确实一样@波动的回答,只是排序为您处理。
Cavaet: random_combinations
需要迭代的长度超过的值r
否则产生一个错误。