27

我非常清楚如何从列表中选择一个随机项目,random.choice(seq)但我怎么知道该元素的索引?

4

7 回答 7

28
import random
l = ['a','b','c','d','e']
i = random.choice(range(len(l)))
print i, l[i]
于 2011-05-25T16:41:07.437 回答
13

您可以首先选择一个随机索引,然后获取该位置的列表元素以同时具有索引和值。

>>> import random
>>> a = [1, 2, 3, 4, 5]
>>> index = random.randint(0,len(a)-1)
>>> index
0
>>> a[index]
1
于 2011-05-25T16:22:28.863 回答
6

您可以使用随机模块中的randrange函数来完成

import random
l = ['a','b','c','d','e']
i = random.randrange(len(l))
print i, l[i]
于 2017-02-04T08:23:51.200 回答
3

最优雅的方法是random.randrange

index = random.randrange(len(MY_LIST))
value = MY_LIST[index]

也可以在 python3 中执行此操作,在范围对象上使用random.choice不太优雅(但仍然比 更好.index) :

index = random.choice(range(len(MY_LIST)))
value = MY_LIST[index]

唯一有效的解决方案是这个解决方案和random.randint解决方案。

使用的list.index不仅很慢(O(N)每次查找而不是O(1); 如果你对每个元素都这样做,你将不得不进行O(N^2)比较),而且如果列表元素不是唯一的,你也会得到歪斜/不正确的结果。

有人会认为这很慢,但事实证明它只比其他正确的解决方案稍慢random.randint,并且可能更具可读性。我个人认为它更优雅,因为人们不必像处理 那样做数字索引摆弄和使用不必要的参数randint(0,len(...)-1),但有些人可能认为这是一种特性,尽管需要知道randint包含范围的约定[start, stop]

random.choice 的速度证明:这样做的唯一原因是该range对象已针对索引进行了优化。作为证明,你可以这样做random.choice(range(10**12));如果它遍历整个列表,您的机器将会慢到爬行。

编辑:我忽略了 randrange 因为文档似乎说“不要使用这个函数”(但实际上意味着“这个函数是 pythonic,使用它”)。感谢 martineau 指出这一点。

您当然可以将其抽象为一个函数:

def randomElement(sequence):
    index = random.randrange(len(sequence))
    return index,sequence[index]

i,value = randomElement(range(10**15))  # try THAT with .index, heh
                                        # (don't, your machine will die)
                                        # use xrange if using python2
# i,value = (268840440712786, 268840440712786)
于 2011-05-25T16:41:17.433 回答
2

如果值在序列中是唯一的,您总是可以说: list.index(value)

于 2011-05-25T16:14:03.590 回答
0

我们也可以使用 sample() 方法。如果要从列表中随机选择 n 个元素

import random
l, n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 2
index_list = random.sample(range(len(l)), n)

index_list 将具有唯一索引。

我更喜欢 sample() 而不是 selection() 因为 sample() 不允许序列中的重复元素。

于 2021-01-05T17:38:37.147 回答
0

按照建议使用randrage()是获取索引的好方法。通过创建通过理解创建的字典,您可以将此代码减少为一行,如下所示。请注意,由于该字典只有一个元素,因此当您调用 popitem()时,您会在一个元组中获得组合的索引和值。

import random

letters = "abcdefghijklmnopqrstuvwxyz"

# dictionary created via comprehension
idx, val = {i: letters[i] for i in [random.randrange(len(letters))]}.popitem()

print("index {} value {}" .format(idx, val))
于 2017-05-27T06:16:17.680 回答