如何在同一行代码中使用 `if` 和 `for`? [复制]

Posted

技术标签:

【中文标题】如何在同一行代码中使用 `if` 和 `for`? [复制]【英文标题】:How use `if` and `for` in the same line of code? [duplicate] 【发布时间】:2021-10-03 12:25:46 【问题描述】:

请看以下代码:

for l in range(len(cosine_scores)):
            for s in range(len(skill_index)):
                if l!=skill_index[s] :
                    if cosine_scores[l][skill_index[s]]>=0.80:
                        print(l)

如何在打印 l 之前以 if 条件满足所有 s 的方式重写此代码?

例如,如果我有

my_list=[[10,8],[8,,0,1,2,7],[6,15,8]]

for i in my_list:
    for j in i:
       if j>5:      # I don't know what I should add here to say if this condition is true for all j in i. 
         print(i)

正确的输出应该是[10,8][6,15,8]

【问题讨论】:

“在打印 l 之前满足所有 s 的条件”是什么意思?尝试用文字非常准确地描述这一点,而不必担心 python 语法。您是否希望skill_index 的每个元素都等于cosine_curves 的当前元素? 对于第二个示例,请查看 all() 函数。 【参考方案1】:

我通常用布尔值来解决这样的问题。

my_list=[[10,8],[8,0,1,2,7],[6,15,8]]

printIt = True

for i in my_list:
    for j in i:
        if j<5:   
            printIt = False
    if printIt:
        print(i)
    else:
        printIt = True

【讨论】:

【参考方案2】:

一般情况

    all方法

    all 如果可迭代对象的所有元素都为真(或可迭代对象为空),则返回 True

    for i in my_list:
        if all(j > 5 for j in i):
            print(i)
    

    for/else

    else 块仅被调用,因为在迭代期间没有使用 break

    for i in my_list:
        for j in i:
            if not j > 5:
                break
        else:
            print(i)
    

你的情况

for l in range(len(cosine_scores)):
    for s in range(len(skill_index)):
        if not (l != skill_index[s] and cosine_scores[l][skill_index[s]] >= 0.80):
            break
    else:
        print(l)

--- 

for l in range(len(cosine_scores)):
    if all(l != skill and cosine_scores[l][skill] >= 0.80 for skill in skill_index):
        print(l)

【讨论】:

另一种选择,如果您的支票很小,而您的清单很大,那么可能更快的是相反的。有一个像bad=[0,1,2,3,4,5] 这样的“坏列表”,然后使用if any(x in good for x in bad): check=False,然后使用if check: print(good) --- 我并不是说这是理想的,但有时向后工作可以节省大量时间。特别是当你的“坏”列表相对较小时——你也可以只做if any(x in good for x in range(0,6)——换句话说,这是循环遍历较小的列表而不是较大的列表(在某些情况下可能是 10k 行)跨度> 【参考方案3】:

在list comprehension 中使用all() 的单线解决方案:

result = [i for i in my_list if all(j > 5 for j in i)]

【讨论】:

【参考方案4】:

您也可以使用布尔变量作为开关:

my_list=[[10,8],[8,,0,1,2,7],[6,15,8]]

for i in my_list:
    
    ALLTRUE = True

    for j in i:
        if not j>5:
            ALLTRUE = False
    
    if ALLTRUE:
        print(i)      
            

【讨论】:

以上是关于如何在同一行代码中使用 `if` 和 `for`? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如果满足 for 循环中的条件,则在同一行中的其他单元格中获取值

如何将表中的所有td对齐在同一行中

如何使用材料在同一行中制作图标和占位符?

创建一个循环以在同一行中记录下一个记录时间和日期(基于唯一 ID)

四月二十五号日报

如何在同一行记录控制台或清除节点中的控制台? [复制]