1

私はPythonが初めてで、ciscoルーターからの「show ip accounting」情報をソートするスクリプトを作成しました。スクリプトはファイルを読み取り、すべての行をリストに分割してから、すべての行のリストを作成します。だから私はリストのリストになります:

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

リスト内のリストの3列目または4列目でソートできるようにしたいです。

ラムダ関数を使用してそれを行うことができましたが、私の質問は、標準関数を使用してこれを複製する方法ですか?

ここに私のコードがあります:

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)

だから私の質問は、ラムダ関数を標準のカスタムソート関数として複製するにはどうすればよいですか? これがどのように機能するかを理解しようとしています。

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

4

2 に答える 2

4

ラムダ関数を標準のカスタムソート関数として複製するにはどうすればよいですか?

これを意味しますか:

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

?

于 2013-01-25T22:41:26.040 に答える
1

Pythonは、この種のことを行うためのoperator.itemgetterを提供します。

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

編集

@NPEが指摘したように、それはキーをintソート用に変換しません。そのためには、ラムダに固執するのが最善です。

于 2013-01-25T22:49:35.507 に答える