Python:如何使用循环仅访问列表的一些布尔元素?

Posted

技术标签:

【中文标题】Python:如何使用循环仅访问列表的一些布尔元素?【英文标题】:Python: How to access only some boolean elements of a list with a loop? 【发布时间】:2012-01-23 23:47:22 【问题描述】:

我有这样的列表:listvalues = [True, True, False, True, False, 24, somestring, 50] 所以列表的前五个元素是布尔值,其余的是字符串和整数。 现在我想检查前五个元素是真还是假,如果它们是真的, 我想使用某种方法,具体取决于元素的索引。 因此,在上述情况下,应该对第一个元素(索引 0)执行一个操作,然后对第二个元素(索引 1)执行另一个操作,然后对第四个元素执行另一个操作。 如果所有布尔值都为假,则应出现警告。 很抱歉这个菜鸟问题,但我自己找不到一个简短而简单的解决方案......

【问题讨论】:

我建议这种方法存在一个根本问题,它不会产生好的代码。您可以尝试使用面向对象的技术来解决这个问题。 查看enumerate 的文档。如果这不是让您绊倒的原因,请考虑添加一些有关您尝试过的内容以及您无法弄清楚的方面的详细信息。 它是listvalues = [True, True, False, True, False, 24, "somestring", 50] true 不是布尔值,True 是 【参考方案1】:

这里有很多东西可能会有所帮助。首先,您应该使用列表切片来隔离布尔值。如果您知道前 5 个元素是您所追求的,那么 myList[0:5] 将只获取这些元素而忽略其他元素。

接下来,查看any 函数。如果任何元素为 True,它将返回 True,因此您可以这样做来决定是否需要发出警告:

if not any(myList[0:5]):
  # Code here to issue the warning.

接下来,要处理要调用的函数,您可能需要这样的东西:

funcList = [f0, f1, f2, f3, f4]
for idx, test in enumerate(myList[0:5]):
  if test: funcList[idx]()

但理想情况下,如果您想跳过该函数,最好将单个函数的引用而不是布尔值放在原始列表中,并将其值设置为 None 可能会更好。您的原始列表最终将如下所示:

myList = [f1, f2, None, f3, None, 24, "string", 50]

要打电话给你想打电话的人,你会这样做:

for func in myList[0:5]:
  if func is not None: func()

【讨论】:

非常感谢,切片在这里非常有用,我不知道任何功能:)【参考方案2】:
all_false = True
for x in yourlist:
   if x is True:
       # call some method
       # ...
       all_false = False

if all_false:
    # print warning

【讨论】:

【参考方案3】:

鉴于您已经定义了要为每种情况应用的函数,您可以将它们放在一个列表中以在循环中调用它们

perform = [func1, func2, func3, func4, func5]

if not any(listvalues[:5]): raise Exception

for index in range(5):
    if listvalues[index]:
        func = perform[index]
        func()

【讨论】:

你不能这样初始化字典!对于这种情况,列表将是正确的工具 @JBernardo 你说得对,对不起,我没有三思而后行。在这种情况下,列表是正确的。已更正。仍然从字典初始化错误中我发现adict = dict(1=a)adict = dict(one=a)adict = 1:'a' 之间的区别是在我的大脑中建立了一些错误的连接【参考方案4】:
if your_list[:5] == [False,False,False,False,False]:
    print 'warning'
else:
    method1(your_list[0])
    method2(your_list[1])
    method3(your_list[2])
    method4(your_list[3])
    method5(your_list[4])

def method1(myBool):
    if myBool == False:
        return
    --- method content ---

def method2(myBool):
    if myBool == False:
        return
    --- method content ---
...

这将是我的解决方案。

【讨论】:

我试过你的方法,但它说“放弃:分配前引用局部变量'method1'”【参考方案5】:

如果没有布尔值,是否有警告?

if not any(filter(lambda x: type(x)==bool, listvalues)):
    print "warning"
else:
    filter(lambda x: type(x[1])==bool and x[1]==True, enumerate(listvalues))

抱歉,忘记了前 5 个元素部分,直接切片.. 不需要检查 bool...

【讨论】:

以上是关于Python:如何使用循环仅访问列表的一些布尔元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改嵌套列表中的元素?

布尔&list与条件循环语句与trutle

如何使用循环访问列表元素的特定部分?

python基础学习-列表

python中的生成器

Python:如果任意元素在任意列表中,则返回布尔值