But is there a other way to do this? without iterating over the whole list?
不。不需要遍历整个列表。在
由于您希望检查每个元组,以查看您希望更改的元素是否是某个数字,因此必须以某种方式遍历整个列表。所以剩下的唯一考虑就是如何去做。在
有很好的、经过时间检验和行业标准的指导方针可以帮助您决定如何编写代码:在编写代码时,您应该优先考虑代码的可读性。代码效率是一个遥远的秒。这条规则也有例外,但它们在这里并不相关。在
看看你的原始代码。它假设item是list,因此我也将:for item in myList:
if item[0] == 1:
item[0] = 3
现在对比一下阿什维尼的建议:
^{pr2}$
现在问问你自己:哪一个最容易阅读和理解?我认为答案是显而易见的。在
哪个更有效?在
让我们看看效率:您的原始代码:对于myList中的每个项目,执行一个列表查找,然后可能执行一个列表分配,这两个操作都非常快速。
Ashwinis代码:重建整个结构。对于myList中的每个项目,python需要创建3个新列表(如果您想更改不是第一个的项目,则需要创建5个)。Python必须为每个列表分配新内存,并对大量旧列表进行垃圾收集,这两种操作都相当缓慢。都是为了把它塞进一行。
请使用原始代码。原因如下:这是很明显的方法。在
这是Python的方法。在
这是最具可读性的方法。在
这是最有效的方法。在
这意味着这是正确的方法。在
如果您想要一个一行程序,请将其设为一个函数:def conditional_sublist_assign(myList, index, from, to):
"""
For each `item` in `myList`, set `item[index] = to` if `item[index] == from`.
"""
for item in myList:
if item[index] == from:
item[index] = to
# Here's your one-liner:
conditional_sublist_assign(myList, 0, 1, 3)
为了使我的论点更有说服力,以下是The Zen of Python中的一些相关行:美总比丑好。在
简单总比复杂好。在
可读性很重要。在
应该有一种——最好只有一种——显而易见的方法。在
如果实现很难解释,这是个坏主意。在