有什么办法可以让这个Python代码更简单吗?

ful*_*inu 2 python

if pop0_dict['max_value1_index'] in (4,5) or pop0_dict['max_value2_index'] in (4,5) or \
    pop1_dict['max_value1_index'] in (4,5) or pop1_dict['max_value2_index'] in (4,5) or \
    pop2_dict['max_value1_index'] in (4,5) or pop2_dict['max_value2_index'] in (4,5) or \
    pop3_dict['max_value1_index'] in (4,5) or pop3_dict['max_value2_index'] in (4,5) or \
    pop4_dict['max_value1_index'] in (4,5) or pop4_dict['max_value2_index'] in (4,5) or \
    pop5_dict['max_value1_index'] in (4,5) or pop5_dict['max_value2_index'] in (4,5):
Run Code Online (Sandbox Code Playgroud)

它看起来非常重复,所以我想知道是否有任何方法可以使其更简单,尽管仍然可读。

che*_*ner 15

使用any

dicts = [pop0_dict, pop1_dict, pop2_dict, pop3_dict, pop4_dict, pop5_dict]
indices = ['max_value1_index', 'max_value2_index']
if any(d[i] in (4,5) for d in dicts for i in indices):
    ...
Run Code Online (Sandbox Code Playgroud)

的参数any是一个生成器表达式,它根据消费者 ( any) 的要求延迟生成值。一旦any找到一个True值,它就会返回True,从而使您可以避免执行额外的不必要的包含检查。

  • 这里没有列表理解。`d[i] for d in dicts for i inindexs` 是一个[生成器表达式](https://docs.python.org/3/reference/expressions.html#generator-expressions)。区别很重要:列表理解会在“any”开始查看之前构建所有布尔值的列表,而生成器表达式仅在“any”要求时生成值。如果 (4,5) 中 d[i] 的第一个值为 True,则可以跳过其余的包含检查。 (5认同)
  • 这是列表理解。 (3认同)