Skip to main content
 首页 » 编程设计

python之使这个简单的 for/if block 更像 pythonic

2025年05月04日13wuhuacong

我需要将 3 个列表中超过给定最大限制的那些值的索引存储在列表中。这是我得到的:

# Data lists. 
a = [3,4,5,12,6,8,78,5,6] 
b = [6,4,1,2,8,784,43,6,2] 
c = [8,4,32,6,1,7,2,9,23] 
 
# Maximum limit. 
max_limit = 20. 
 
# Store indexes in list. 
indexes = [] 
for i, a_elem in enumerate(a): 
    if a_elem > max_limit or b[i] > max_limit or c[i] > max_limit: 
        indexes.append(i) 

这行得通,但我觉得它很丑。我怎样才能让它更优雅/pythonic?

请您参考如下方法:

您可以将 for 循环替换为:

indexes = [] 
for i, triplet in enumerate(zip(a, b, c)): 
    if any(e > max_limit for e in triplet): 
        indexes.append(i) 

...然后您可以将其简化为列表理解:

indexes = [i for i, t in enumerate(zip(a, b, c)) if any(e > max_limit for e in t)] 

...虽然这对我来说似乎有点笨拙 - 这确实与个人品味有关,但我更喜欢保持 listcomps 简单;在我看来,三行 for 循环更清晰。

正如 user2357112 所指出的,您可以使用 max() 降低列表理解的表面复杂性:

indexes = [i for i, t in enumerate(zip(a, b, c)) if max(t) > max_limit] 

...虽然这不会像 any() 版本(和您自己的代码)那样短路,但可能会稍微慢一些。