繁体   English   中英

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

[英]Python: How to access only some boolean elements of a list with a loop?

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

这里有很多事情可能会有所帮助。 首先,您应该使用列表切片来分隔布尔值。 如果您知道所要myList[0:5]的前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()
all_false = True
for x in yourlist:
   if x is True:
       # call some method
       # ...
       all_false = False

if all_false:
    # print warning

既然已经定义了要在每种情况下应用的功能,则可以将它们放在列表中以在循环中调用它们

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()

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

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 ...

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 ---
...

将是我的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM