3

リストを並べ替えたい各リストの最初の要素に基づいて、リストのリストがあります。これらのインデックスのサンプル:

  vlan1                    
  usb0                   
  eth1                     
  vlan4                   
  vlan20  

それらがそれぞれ vlanX と同じ長さである場合、次のようにします。

 table_data = sorted(table_data, key = lambda x: int(x[0][4:]))

vlan が最初に来て、残りは問題にならないような方法でそれらを並べ替えたいと思います。それらがソートされていれば素晴らしいですが、必須ではありません(複数のusbまたはethが存在することはないと思います)。

  vlan1
  vlan4 
  vlan20                    
  usb0                    
  eth1                                 

ラムダを調整して実行するのは簡単ですか、それとも関数を作成して実行するだけですか?

私はこれを試しましたが、明らかに、vlan をソートしている間、usb と eth が間違った場所にそのまま残ります。

table_data = sorted(table_data, key = lambda x: x = True if "vlan" not in x[0] else int(x[0][4:]))

編集:そのスレッドは私が望むものに答えませんか? それは、usb 要素と eth 要素を vlan 要素の間に並べ替えますが、これは私が望むものではありません。

4

1 に答える 1

2

名前を (プレフィックス、インデックス) で分割する関数を記述し、それをkeyパラメーターに渡すことができます。

import re
table_data = ["vlan1", "usb0", "eth1", "vlan4", "vlan20"]

def get_key(v):
    prefix, index = re.match(r'([a-z]+)(\d+)', v).groups()
    return prefix, -int(index)

>>> sorted(table_data, key=get_key, reverse=True)
['vlan1', 'vlan4', 'vlan20', 'usb0', 'eth1']

順序をプレフィックスで降順、インデックスで昇順にしたい場合、関数はインデックスを負に変換しているため、リストが逆になったときに順序が正しくなります。

[アップデート]

いいえ、OP は順序がプレフィックスで降順であることを望んでいません。OPは、関係なく、「vlan」を最初にソートすることを望んでいます。これはたまたまアルファベットの降順ソートに適合しますが、「wlan」キーがデータに追加された場合は適合しません。– マーティン・ピーターズ

けっこうだ。

def get_key(v):
    prefix, index = re.match(r'([a-z]+)(\d+)', v).groups()
    if prefix == 'vlan':
        prefix = '~'
    return prefix, -int(index)

>>> table_data = ["vlan1", "usb0", "eth1", "vlan4", "vlan20", "wlan0"]
>>> sorted(table_data, key=get_key, reverse=True)
['vlan1', 'vlan4', 'vlan20', 'wlan0', 'usb0', 'eth1']

dictを組み立てるのはどうですか?

interfaces = {}
for iface in table_data:
    prefix, index = re.match(r'([a-z]+)(\d+)', iface).groups()
    interfaces.setdefault(prefix, []).append(iface)
for v in interfaces.values():
    v.sort(key=lambda x: int(re.search(r'\d+', x).group(0)))

>>> interfaces
{'eth': ['eth1'],
 'usb': ['usb0'],
 'vlan': ['vlan1', 'vlan4', 'vlan20'],
 'wlan': ['wlan0']}

>>> interface_types = interfaces.keys()
>>> interface_types
['eth', 'vlan', 'wlan', 'usb']

>>> interfaces['vlan']
['vlan1', 'vlan4', 'vlan20']
于 2013-07-22T11:50:08.750 に答える