如何从2D列表中以pythonical方式选择一个随机索引,以便相应的元素匹配一个值?
我有一个布尔人的2D列表。我想从值为如何从2D列表中以pythonical方式选择一个随机索引,以便相应的元素匹配一个值?,python,python-3.x,list,random,Python,Python 3.x,List,Random,我有一个布尔人的2D列表。我想从值为False的列表中选择一个随机索引。例如,给定以下列表: [[True, False, False], [True, True, True], [False, True, True]] 有效的选择将是:[0,1]、[0,2]和[2,0] 我可以保留一个有效索引列表,然后使用random.choice从中进行选择,但保留一个变量并在基础列表每次更改时仅出于这一目的对其进行更新似乎是不和谐的 如果您的答案运行速度快,将获得额外积分 我们可以使用一行程序,如:
False
的列表中选择一个随机索引。例如,给定以下列表:
[[True, False, False],
[True, True, True],
[False, True, True]]
有效的选择将是:[0,1]
、[0,2]
和[2,0]
我可以保留一个有效索引列表,然后使用random.choice
从中进行选择,但保留一个变量并在基础列表每次更改时仅出于这一目的对其进行更新似乎是不和谐的
如果您的答案运行速度快,将获得额外积分 我们可以使用一行程序,如:
import numpy as np
from random import choice
choice(np.argwhere(~a))
使用a
布尔数组
其工作原理如下:通过使用~a
,我们对数组的元素求反。接下来,我们使用np.argwhere
构造一个k×2数组:一个数组,其中每一行有两个元素:对于每个维度,对应的值具有as valueFalse
通过选择(…)
我们因此选择了一个随机行。但是,我们不能直接使用它来访问元素。我们可以使用元组(…)
构造函数将其转换为元组:
>>> tuple(choice(np.argwhere(~a)))
(2, 0)
因此,您可以使用以下方法获取元素:
t = tuple(choice(np.argwhere(~a)))
a[t]
但当然,这并不奇怪:
>>> t = tuple(choice(np.argwhere(~a)))
>>> a[t]
False
我们可以使用一行程序,如:
import numpy as np
from random import choice
choice(np.argwhere(~a))
使用a
布尔数组
其工作原理如下:通过使用~a
,我们对数组的元素求反。接下来,我们使用np.argwhere
构造一个k×2数组:一个数组,其中每一行有两个元素:对于每个维度,对应的值具有as valueFalse
通过选择(…)
我们因此选择了一个随机行。但是,我们不能直接使用它来访问元素。我们可以使用元组(…)
构造函数将其转换为元组:
>>> tuple(choice(np.argwhere(~a)))
(2, 0)
因此,您可以使用以下方法获取元素:
t = tuple(choice(np.argwhere(~a)))
a[t]
但当然,这并不奇怪:
>>> t = tuple(choice(np.argwhere(~a)))
>>> a[t]
False
我的非numpy版本:
result = random.choice([
(i,j)
for i in range(len(a))
for j in range(len(a[i]))
if not a[i][j]])
与Willem的np
版本类似,这将生成一个有效元组列表,并调用random.choice()
来选择一个元组
或者,如果您和我一样讨厌看到range(len(…)
,那么这里有一个enumerate()
版本:
result = random.choice([
(i, j)
for i, row in enumerate(a)
for j, cell in enumerate(row)
if not cell])
我的非numpy版本:
result = random.choice([
(i,j)
for i in range(len(a))
for j in range(len(a[i]))
if not a[i][j]])
与Willem的np
版本类似,这将生成一个有效元组列表,并调用random.choice()
来选择一个元组
或者,如果您和我一样讨厌看到range(len(…)
,那么这里有一个enumerate()
版本:
result = random.choice([
(i, j)
for i, row in enumerate(a)
for j, cell in enumerate(row)
if not cell])
假设你不想使用numpy
matrix = [[True, False, False],
[True, True, True],
[False, True, True]]
valid_choices = [(i,j) for i, x in enumerate(matrix) for j, y in enumerate(x) if not y]
random.choice(valid_choices)
通过列表理解,您可以更改if条件(
if not y
),以满足您的需要。这将返回随机选择的坐标,但您可以选择将列表中的值部分更改为:y
,并返回false,尽管在这种情况下有点多余。假设您不想使用numpy
matrix = [[True, False, False],
[True, True, True],
[False, True, True]]
valid_choices = [(i,j) for i, x in enumerate(matrix) for j, y in enumerate(x) if not y]
random.choice(valid_choices)
通过列表理解,您可以更改if条件(
if not y
),以满足您的需要。这将返回随机选择的坐标,但您可以选择将列表中的值部分更改为:y
,并返回false,尽管在这种情况下有点多余。给定的输出无效,您可能会查找两项列表?@WillemVanOnsem edited。我是这样写的,因为这就是执行查找的方式。但是是的,这让人困惑,你多久做一次选择,多久修改一次列表?听起来,保留一个辅助数据结构来跟踪有效的索引将节省大量计算。给定的输出无效,您可能会查找两项列表?@WillemVanOnsem edited。我是这样写的,因为这就是执行查找的方式。但是是的,这让人困惑,你多久做一次选择,多久修改一次列表?听起来像是保留一个辅助数据结构来跟踪有效索引会节省大量计算。这可以使用来简化。@user2357112:谢谢,不知道argwhere
。这可以使用来简化。@user2357112:谢谢,不知道argwhere
。