Python 3.x 如何将if、elif条件中包含多个语句的for循环转换为列表理解
我想把上面的for循环转换成list。我试过了Python 3.x 如何将if、elif条件中包含多个语句的for循环转换为列表理解,python-3.x,list-comprehension,Python 3.x,List Comprehension,我想把上面的for循环转换成list。我试过了 for i in range(len(q)): # q.remove(max(q)) # maxi = max(q) if((q.index(max(q)))+3) in range(len(q)): return("Too chaotic") if((q.index(max(q)))+2) in range(len(q)): bribe = bri
for i in range(len(q)):
# q.remove(max(q))
# maxi = max(q)
if((q.index(max(q)))+3) in range(len(q)):
return("Too chaotic")
if((q.index(max(q)))+2) in range(len(q)):
bribe = bribe + 2
q.remove(max(q))
elif ((q.index(max(q)))+1) in range(len(q)):
bribe = bribe + 1
q.remove(max(q))
elif(q.index(max(q))) == (len(q)-1):
q.remove(max(q))
return(bribe)
但是它不起作用。有几十个这样的问题:如何将这段代码转换为列表/目录理解?我看到了三个主要目标:
- 性能:希望提高代码的速度或减少内存占用李>
- 表达性:一个人想要一个简洁明了的代码李>
- 学习/乐趣/实验:一个人想要了解列表理解本身
返回
,中断
,提升
,…)-1
)或引发异常
这里还有一些问题需要解决:
- 从不使用
:将其替换为i
(请参阅)李>。
- 计算
一次,并将其存储在变量q.index(max(q))
李>max_q_index
表示x在范围内(len(q))
0不。你让你未来的自我变得非常非常艰难。不需要将所有内容都转换为列表理解,当列表变得不可读时就不需要了。注意:
和如果
不是函数,它们就不需要elif
。在这里,您确实过度使用了括号,使得在没有列表理解的情况下阅读代码中发生的事情变得非常困难。列表理解用于创建值列表。不要仅仅因为它们包含循环就使用它们。它们不是用于更换回路的通用衬里(…)
也是一种很难解析的表达someinteger-in-range(len(q))
0的方式,请参阅以清理您发布的代码;但是,可以使用带有
的排序重新编写它。不管怎样,这都不适合列表比较。enumerate()
["Too chaotic" if((q.index(max(q)))+3) in range(len(q)) bribe+2,q.remove(max(q)) if((q.index(max(q)))+2) in range(len(q)) else [bribe+2,q.remove(max(q)] if((q.index(max(q)))+2) in range(len(q)) else q.remove(max(q)) if (q.inde (max(q))) == (len(q)-1) for i in range(len(q))]
for _ in range(len(q)): m = max(q) max_q_index = q.index(m) # position of the max if max_q_index < len(q) - 3: return -1 if max_q_index < len(q) - 2: bribe = bribe + 2 q.remove(m) elif max_q_index < len(q) - 1: bribe = bribe + 1 q.remove(m) elif max_q_index == len(q)-1: q.remove(m) # no else since max_index < len(q)
for _ in range(len(q)): m = max(q) max_q_index = q.index(max(q)) # position of the max if max_index < len(q) - 3: return -1 if max_index == len(q) - 3: bribe = bribe + 2 elif max_index == len(q) - 2: bribe = bribe + 1 q.remove(m)
for _ in range(len(q)): m = max(q) max_q_index = q.index(m) # position of the max distance = len(q) - 1 - max_q_index if distance >= 3: return -1 bribe += distance q.remove(m)
>>> L = [1,2,4,3,7,5] >>> list(zip(L, range(len(L)))) [(1, 0), (2, 1), (4, 2), (3, 3), (7, 4), (5, 5)] >>> S = sorted(zip(L, range(len(L)))) >>> S [(1, 0), (2, 1), (3, 3), (4, 2), (5, 5), (7, 4)]
>>> bribe = 0 >>> for i, (_, pos) in enumerate(S): ... distance = max(i - pos, 0) ... if distance >= 3: ... raise Exception() # can't return outside of a function. ... bribe += distance ... >>> bribe 2
>>> L = [1,2,4,3,7,5] >>> sum(max(i - pos, 0) for i, (_, pos) in enumerate(sorted(zip(L, range(len(L)))))) 2 >>> L = [1,2,7,3,4,5] >>> sum(max(i - pos, 0) for i, (_, pos) in enumerate(sorted(zip(L, range(len(L)))))) 3