如何检查一个数字是不是在列表列表中?

Posted

技术标签:

【中文标题】如何检查一个数字是不是在列表列表中?【英文标题】:How to check if a number is in a list of lists?如何检查一个数字是否在列表列表中? 【发布时间】:2017-05-30 19:22:42 【问题描述】:

所以我一直无法检查数字 0 是否在另一个列表中的一组列表中。这些行构成了我正在制作的 pacman 类型游戏的迷宫,所以这里的重点是检查 pacman 是否已经吃掉了所有的硬币。

这是我的代码:

row1 =[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]
row2 =[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
row3 =[1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1]
row4 =[1,0,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,0,1]
row5 =[1,0,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,0,1]
row6 =[1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1]
row7 =[1,0,1,1,0,1,0,1,1,1,1,1,0,1,0,1,1,0,1]
row8 =[1,0,0,0,0,1,0,1,1,1,1,1,0,1,0,0,0,0,1]
row9 =[1,1,1,1,0,1,0,0,0,1,0,0,0,1,0,1,1,1,1]
row10=[3,3,3,1,0,1,1,1,0,1,0,1,1,1,0,1,3,3,3]
row11=[3,3,3,1,0,1,0,0,0,0,0,0,0,1,0,1,3,3,3]
row12=[3,3,3,1,0,1,0,1,4,4,4,1,0,1,0,1,3,3,3]
row13=[1,1,1,1,0,1,0,1,3,3,3,1,0,1,0,1,1,1,1]
row14=[3,3,3,3,0,0,0,1,3,3,3,1,0,0,0,3,3,3,3]
row15=[1,1,1,1,0,1,0,1,5,5,5,1,0,1,0,1,1,1,1]
row16=[3,3,3,1,0,1,0,3,3,3,3,3,0,1,0,1,3,3,3]
row17=[3,3,3,1,0,1,0,1,1,1,1,1,0,1,0,1,3,3,3]
row18=[3,3,3,1,0,1,0,1,1,1,1,1,0,1,0,1,3,3,3]
row19=[1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1]
row20=[1,0,0,0,0,1,1,1,0,1,0,1,1,1,0,0,0,0,1]
row21=[1,0,1,1,0,0,0,0,0,3,0,0,0,0,0,1,1,0,1]
row22=[1,0,1,1,0,1,0,1,1,1,1,1,0,1,0,1,1,0,1]
row23=[1,2,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,1]
row24=[1,0,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1]
row25=[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]
row26=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]

maze = [row1,row2,row3,row4,row5,row6,row7,row8,row9,row10,row11,row12,
        row13,row14,row15,row16,row17,row18,row19,row20,row21,row22,
        row23,row24,row25,row26]

所以我试过if 0 not in maze: 但是if语句将执行无论0是否在(迷宫)中。

任何帮助将不胜感激,谢谢。

【问题讨论】:

not any(el == 0 for sublist in maze for el in sublist) @DYZ 对我来说似乎很清楚。号码是0 @leaf 标题是“数字”,而不是 0。我不清楚。 @DYZ 但是,如果您阅读第一句话,它的字面意思是“0” @DYZ 但他在问题的第一部分说 - 所以我一直无法检查 数字 0" 是否。 【参考方案1】:

您必须遍历 maze 中的每个列表并检查是否有 0:

if not any(0 in i for i in maze):
    ...

any() 函数的伟大之处在于,一旦找到 0,它就会停止循环遍历 maze

【讨论】:

【参考方案2】:

在您的第一次尝试中,您对***列表中的0 的唯一测试。当然,***列表只有列表,因此您的测试失败。

您必须遍历maze 中的每个子列表。您可以使用手动 for 循环,这是一个有效的选项:

def has_zero(maze):
    for sublist in maze:
        for el in sublist:
            if el == 0:
                return True
    return False

但是 Python 提供了一个更好的方法 any() 函数(这基本上是上述函数的一个更好的实现):

如果可迭代的任何元素为真,则返回真。如果可迭代对象为空,则返回 False[...]。

但您还必须使用not 运算符(在其他语言中称为!)来否定any() 可能返回的真值。因此,完整的解决方案是:

not any(el == 0 for sublist in maze for el in sublist)

【讨论】:

【参考方案3】:

any 已经被提及,但您也可以展平您的列表(例如使用itertools.chain.from_iterable)并检查该项目是否包含:

from itertools import chain

if 0 in chain.from_iterable(lst):
    # do something

any 一样,一旦找到它就会停止。之所以提及它,是因为它经常被忽视:生成器和迭代器(如chain)通常支持in 运算符。

【讨论】:

【参考方案4】:

遍历子列表。也可以使用any()

if any(0 in sublist for sublist in maze)

它会检查列表中是否有任何0

【讨论】:

【参考方案5】:

只要我理解您的问题,您可以使用以下代码:

a = [1,1,1]
b = [1,0,1]
c = [0,1,2]
d = [a,b,c]

for i in d:    
  if i.__contains__(0):
    print("yes") 

【讨论】:

您几乎不应该在代码中使用__contains__ 或其他任何用双下划线括起来的内容。 感谢您的建议,我是新手,我会检查一下。 你可以多解释一下代码的作用。 @DYZ 您有任何来源来支持您的声明吗?我一直认为不应该使用以单下划线开头的函数/属性/方法。 @MSeifert ***.com/questions/8689964/… 引用:“虽然您可以直接调用这些方法(例如 [10, 20].__len__()),但下划线的存在暗示这些方法是有意的被间接调用(例如 len([10, 20]))。"

以上是关于如何检查一个数字是不是在列表列表中?的主要内容,如果未能解决你的问题,请参考以下文章

检查列表中是不是存在数字,应用引擎模板

jquery检查数字是不是在列表中[重复]

如何检查列表中的项目是不是是python中任意数字的幂?

检查数字不是列表中 2 个整数的总和

Python - 如何在列表中查找不是最小值的数字

检查逗号分隔列表是不是包含特定数字[重复]