为了账号安全,请及时绑定邮箱和手机立即绑定

Python 3其他有关列表的问题

Python 3其他有关列表的问题

心有法竹 2021-03-31 13:42:57
我有两个无关的问题,它们也不是至关重要的:问题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 = 0for index in range(len(lists)):    if lists[index].val < lists[smallest_index].val:        smallest_index = index但是有更好的方法吗?使用内置函数来减少行数的更“优雅”的方式?
查看完整描述

2 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

问题1


同时有效地声明它们。如果要基于另一个值来设置一个值,则不应使用单行声明。


演示:


>>> x,y = 1,x+2    

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

NameError: name 'x' is not defined

>>> x,y = 1,y+2

Traceback (most recent call last):

  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 attrgetter

min(nodes, key=attrgetter('val'))

这将返回具有最低val的ListNode。您可以调用.val它来获取值本身。


查看完整回答
反对 回复 2021-04-27
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

关于您的第一个问题,作业既可以一次执行,也可以从左至右执行。从Python的角度以及您无权访问的环境中,您可以立即从左至右访问引擎盖下的字节码级别。您可以使用dis模块进行检查。


In [1]: x,y = 1,2


In [2]: import dis


In [3]: dis.dis('x,y = 1,2')

  1           0 LOAD_CONST               3 ((1, 2))

              3 UNPACK_SEQUENCE          2

              6 STORE_NAME               0 (x)

              9 STORE_NAME               1 (y)

             12 LOAD_CONST               2 (None)

             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'))


查看完整回答
反对 回复 2021-04-27
  • 2 回答
  • 0 关注
  • 151 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号