如何随机选择列表中给定值的索引?

时间:2018-01-20 22:19:37

标签: python list random

假设我有以下8x8 2D列表:

[[0, 1, 0, 1, 0, 1, 0, 1],
[1, 0, 1, 0, 1, 0, 1, 0],
[0, 1, 0, 1, 0, 1, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[-1, 0, -1, 0, -1, 0, -1, 0],
[0, -1, 0, -1, 0, -1, 0, -1],
[-1, 0, -1, 0, -1, 0, -1, 0]]

如何获得值为“1”的随机索引?

3 个答案:

答案 0 :(得分:7)

这是一个很好的单线程,带有嵌套列表理解:

import random
random.choice([(i, j) for i, row in enumerate(x) for j, val in enumerate(row) if val == 1])

其中x是你的清单。您只需收集(i, j)的索引列表val == 1,然后随机选择一个。

答案 1 :(得分:4)

如果列表是矩形的(所有元素都是列表,并且这些列表具有相同的长度,并且这些列表的元素是数字),我们可以使用numpy来改进过滤过程:

from numpy import array, where
from random import choice

choice(array(where(a == 1)).T)

如果a还不是一个numpy数组,我们可以将其转换为:

choice(array(where(array(a) == 1)).T)

然后返回:

>>> choice(array(where(a == 1)).T)
array([1, 2])

如果我们希望结果为listtuple,我们可以调用构造函数,如:

>>> tuple(choice(array(where(a == 1)).T))
(1, 6)

答案 2 :(得分:1)

您可以执行以下操作:

indices = []
for row_idx in range(len(a)):
  for col_idx in range(len(a[row_idx])):
    num = a[row_idx][col_idx]
    if num == 1:
      indices.append((row_idx, col_idx))

import random
rand_idx = random.randrange(0, len(indices))
print indices[rand_idx]