Python 3其他有关列表的问题

我有两个无关的问题,它们也不是至关重要的:


问题1:


单行声明的顺序x,y = 1,2如何?是x先声明还是y先声明?当x和y例如通过引用相关时,这很重要。


问题2:


假设我有一个像这样的linkedList声明:


class ListNode:

    def __init__(self, x):

        self.val = x

        self.next = None

我有一个ListNode类似的清单:


lists = [1->2->3, 2->3->1, 0->9]

如果我想继续比较每个值的第一个值ListNode并找到最小的值,我可以这样做:


smallest_index = 0

for index in range(len(lists)):

    if lists[index].val < lists[smallest_index].val:

        smallest_index = index

但是有更好的方法吗?使用内置函数来减少行数的更“优雅”的方式?


心有法竹
浏览 152回答 2
2回答

倚天杖

问题1同时有效地声明它们。如果要基于另一个值来设置一个值,则不应使用单行声明。演示:>>> x,y = 1,x+2&nbsp; &nbsp;&nbsp;Traceback (most recent call last):&nbsp; File "<stdin>", line 1, in <module>NameError: name 'x' is not defined>>> x,y = 1,y+2Traceback (most recent call last):&nbsp; File "<stdin>", line 1, in <module>NameError: name 'y' is not defined问题2通常,您应该优先考虑可读性而不是优雅,但是要回答您的问题,还有另一种方法可以完成您想做的事情。请注意,此语法lists = [1->2->3, 2->3->1, 0->9]无效,因此我改为这样做:lists = [ListNode(1),ListNode(2),ListNod(3)]from operator import attrgettermin(nodes, key=attrgetter('val'))这将返回具有最低val的ListNode。您可以调用.val它来获取值本身。

白衣染霜花

关于您的第一个问题,作业既可以一次执行,也可以从左至右执行。从Python的角度以及您无权访问的环境中,您可以立即从左至右访问引擎盖下的字节码级别。您可以使用dis模块进行检查。In [1]: x,y = 1,2In [2]: import disIn [3]: dis.dis('x,y = 1,2')&nbsp; 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0 LOAD_CONST&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;3 ((1, 2))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3 UNPACK_SEQUENCE&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6 STORE_NAME&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0 (x)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 9 STORE_NAME&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 (y)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;12 LOAD_CONST&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2 (None)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;15 RETURN_VALUE如您所见,首先在偏移量6x处定义变量,然后在偏移量9处定义y。但是请注意,这并不意味着您可以在同一块中访问新的分配。就是说,在像这样y, x = 9, y+1 的代码中,yis的值是它在赋值之前的值(如果已经声明)。出现这种现象的原因是,您在反汇编的字节码中看到的是在后台而不是在Python级别上发生的事情,并且从您的角度来看,整个字节码将被立即评估。关于第二个问题,您可以在min()函数内使用生成器表达式:min(lst.val for lst in lists)如果要返回Node对象,可以将其operator.attrgetter()用作key函数。min(lists, key=attrgetter('val'))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python