我需要在列表中存储超过给定最大限制的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)
Run Code Online (Sandbox Code Playgroud)
这有效,但我发现它很难看.我怎样才能让它更优雅/ pythonic?
您可以用以下代码替换for循环:
indexes = []
for i, triplet in enumerate(zip(a, b, c)):
if any(e > max_limit for e in triplet):
indexes.append(i)
Run Code Online (Sandbox Code Playgroud)
...然后你可以减少到列表理解:
indexes = [i for i, t in enumerate(zip(a, b, c)) if any(e > max_limit for e in t)]
Run Code Online (Sandbox Code Playgroud)
...虽然这对我来说似乎有点笨拙 - 这真的是关于个人品味,但我更喜欢保持listcomps简单; for在我看来,三线循环更清晰.
正如user2357112所指出的,您可以通过以下方式降低列表理解的明显复杂性max():
indexes = [i for i, t in enumerate(zip(a, b, c)) if max(t) > max_limit]
Run Code Online (Sandbox Code Playgroud)
...虽然这不会像any()版本(和你自己的代码)那样短路,但可能会稍慢一些.