【问题标题】:Understanding lambda functions in python了解python中的lambda函数
【发布时间】:2013-01-25 22:40:00
【问题描述】:

我是 python 新手,我创建了一个脚本来对来自 cisco 路由器的“显示 IP 记帐”信息进行排序。该脚本读取一个文件并将每一行分解为一个列表,然后创建每行的列表。所以我最终得到了一个列表列表:

list a = [[192.168.0.1,172.16.0.1,3434,12222424],[192.168.2.1,172.12.0.1,33334,12667896722424]]

我希望能够按列表中列表的第三列或第四列进行排序。

我可以使用 lambda 函数来做到这一点,但我的问题是如何使用标准函数来复制它?

下面是我的代码:

from sys import argv

script, option, filename = argv
a=[]
b=[]

def openfile(filename):
  file = open(filename)
  for line in file:
    if not line.startswith("  "):
      a.append((line.split()))
  return a

def sort(a,num):
  b = sorted(a, reverse=True, key=lambda x: int(x[num]))
  return b

def top5(b):
  print "Source     Destination Packets     Bytes"
  for i in b[:4]: 
    print i[0]+"    "+i[1]+"    "+i[2]+"        "+i[3]

def main(option):
  a = openfile(filename)
  if option == "--bytes":
    b = sort(a,3)
    top5(b)
  elif option == "--packets":
    b = sort(a,2)
    top5(b)
  else:
    print """
    Not a valid switch, 
    --bytes to sort by bytes 
    --packets to sort by packets."""


main(option)

所以我的问题是如何将 lambda 函数复制为标准的自定义排序函数?我正在尝试弄清楚这是如何工作的。

b = sorted(a, reverse=True, <strong>key=lambda x: int(x[num])</strong>)

【问题讨论】:

标签: python function lambda


【解决方案1】:

如何将 lambda 函数复制为标准的自定义排序函数?

你是这个意思吗:

def sort(a, num):
  def key(x):
    return int(x[num])
  return sorted(a, reverse=True, key=key)

或者这个:

from functools import partial

def key(num, x):
  return int(x[num])

def sort(a, num):
  return sorted(a, reverse=True, key=partial(key, num))

?

【讨论】:

  • 我猜他们实际上是在寻找 itemgetter。
  • @thg435:也许吧。真的很难说。 “标准自定义函数”有点矛盾。
  • 好的,所以我尝试了两种sn-ps的代码,它们都可以工作,我的问题是当你在函数排序内部创建函数键时,如果你不这样做,它会为x获得什么值当你用 key=key 调用它时,不要给它发送任何值?我试图了解这是如何工作的,
  • @user2010044: x 指的是正在请求其密钥的列表项。 sorted() 为列表中的每个元素调用 key(),然后使用它得到的键进行实际排序。
  • @user2010044:键函数不一定要在调用函数中定义。但是如果您想在该函数内的局部变量上创建一个闭包,那么您需要在那里定义它(或使用functools.partial,或将其包装在本地函数或lambda中,等)。
【解决方案2】:

Python 提供了operator.itemgetter 来做这种事情:

def sort(a, num):
    return sorted(a, reverse=True, key=operator.itemgetter(num))

编辑

正如@NPE 指出的那样,这不会将密钥转换为int 进行排序。为此,您最好坚持使用 lambda。

【讨论】:

  • @NPE 是的。我错过了演员阵容
  • 如果你在某个地方有一个compose 函数(例如functional),你可以做compose(int, operator.itemgetter(num))。但我认为这不是 OP 所要求的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-01
  • 1970-01-01
  • 2013-09-08
相关资源
最近更新 更多