假设我有以下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”的随机索引?
答案 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])
如果我们希望结果为list
或tuple
,我们可以调用构造函数,如:
>>> 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]