如何在Python的二维tilemap列表中检测指定值是否存在?
检测二维列表中的特定值
你猜的没错,if 0 in tilemap这类写法只会检查外层列表的直接元素(也就是每个子列表),不会深入子列表内部查找元素,所以即使子列表里有0,也会返回False。要检测二维列表中的9或20,有几种简单高效的方法:
方法一:普通循环遍历(直观易懂)
import random as r # 初始化你的tilemap tilemap = [['W','W','W','W','W','W','W','W','W'],['W',0,0,0,0,0,0,'E','W'],['W',0,r.randint(0,20),r.randint(0,20),r.randint(0,20),r.randint(0,20),r.randint(0,20),0,'W'],['W',0,r.randint(0,20),r.randint(0,20),r.randint(0,20),r.randint(0,20),r.randint(0,20),0,'W'],['W',0,r.randint(0,20),r.randint(0,20),r.randint(0,20),r.randint(0,20),r.randint(0,20),0,'W'],['W',0,r.randint(0,20),r.randint(0,20),r.randint(0,20),r.randint(0,20),r.randint(0,20),0,'W'],['W',0,r.randint(0,20),r.randint(0,20),r.randint(0,20),r.randint(0,20),r.randint(0,20),0,'W'],['W',0,r.randint(0,20),r.randint(0,20),r.randint(0,20),r.randint(0,20),r.randint(0,20),0,'W'],['W','P',0,0,0,0,0,0,'W'],['W','W','W','W','W','W','W','W','W']] targets = {9, 20} found = False for row in tilemap: # 检查当前行是否包含目标值 if any(t in row for t in targets): found = True break # 找到就终止循环,提升效率 print(found)
方法二:一行式简洁写法(Pythonic)
利用any()函数的短路特性,只要找到目标值就停止遍历,效率很高:
# 检查是否存在9或20 has_target = any(9 in row or 20 in row for row in tilemap) # 如果目标值较多,用集合交集判断更高效 has_target = any({9, 20}.intersection(row) for row in tilemap)
原理补充
x in tilemap:判断的是x是否是tilemap的直接成员(即每个子列表),而非子列表内部的元素。any()函数会逐个遍历可迭代对象,只要有一个元素为True就立刻返回True,避免不必要的遍历。
内容的提问来源于stack exchange,提问作者Morris
相关产品推荐
相关产品推荐

