我有一个小清单:
moveless = [0,11,30,31,20,21,22,23,24,25,26,27,28,29]
例如,像这样的数组(它总是嵌套在这样的列表中,但是通常会有成千上万的数组,并且-1到31之间的任何数字都可以位于任何位置):
starting_board = [([[ 6, -1, -1, 11, 0, 11, -1, -1, -1, -1],
[-1, -1, -1, -1, -1, -1, -1, 11, -1, -1],
[-1, -1, -1, -1, -1, -1, -1, 1, -1, -1],
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[-1, -1, -1, -1, -1, -1, -1, -1, -1, 2],
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[-1, -1, -1, 20, 31, -1, 25, -1, -1, -1]])]
并且我需要确定此数组的任何元素是否都不是不可移动的。因此,如果它解析并达到6,它可能会停止。
我觉得必须有一种更快,更优雅/ pythonic的方法来完成此任务,而不仅仅是几个循环,但是我在该站点上的numpy docs / elsewhere中进行的检查并没有发现任何非常有用的东西。
答案 0 :(得分:2)
使用isin()
/data/data/com.yourpackagename/databases/
输出:
starting_board = [([[ 6, -1, -1, 11, 0, 11, -1, -1, -1, -1],
[-1, -1, -1, -1, -1, -1, -1, 11, -1, -1],
[-1, -1, -1, -1, -1, -1, -1, 1, -1, -1],
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[-1, -1, -1, -1, -1, -1, -1, -1, -1, 2],
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[-1, -1, -1, 20, 31, -1, 25, -1, -1, -1]])]
moveless = [0,11,30,31,20,21,22,23,24,25,26,27,28,29]
print(np.isin(starting_board, moveless))
答案 1 :(得分:1)
如果您只需要知道列表中是否没有任何个元素,只需进行一组比较即可:
any_items_not_in_moveless = {element for row in starting_board[0] for element in row} - set(moveless)
# OR
any_items_not_in_moveless = set(np.asarray(starting_board[0]).ravel()) - set(moveless)
正如@Chirag指出的那样,您还可以利用Numpy的isin
函数。对于您自己的情况,您需要找出哪种解决方案对您来说更快/更好:
any_items_not_in_moveless = (~np.asarray(starting_board[0]).isin(moveless)).any()