2017-04-01 32 views
2

假設我們有以下方式在文件中的很多記錄。Pythonic的方式來排序多列記錄

10.10.10.10(tcp/443) : Some SSL Vulnerability : Medium : Patched

10.10.10.11(tcp/888) : Some RCE Vulnerability : High : Not Patched

這些記錄與價值觀Critical, High, Medium, Low第3列。

什麼是以這種方式排序這些記錄的最佳pythonic方法: 1.關鍵,2.High,3.Medium 4. Low?

+1

如何[枚舉](https://docs.python.org/3/library/enum.html)?更具體地說,[IntEnum](https://docs.python.org/3/library/enum.html#intenum)。 –

+0

我們可以假設您知道如何將數據讀入列表並將排序後的列表數據寫回到文件中?你應該發佈[mcve],表明你試圖解決這個問題。你想要一個純粹的Python解決方案嗎?或者你想使用熊貓? –

回答

1

這裏是一個純Python的解決方案,使用字典的Critical, High, Medium, Low字符串轉換爲它們的數值;該數值用作list.sort的排序鍵函數參數。我的關鍵功能還使用每個記錄的第一個字段作爲輔助排序鍵,以便在按等級排序的每個部分中,條目也按該第一個字段排序。

由於您的問題只包含2行樣本數據,我構建了一些簡單的假數據。

data = '''\ 
00 : abc : Low 
01 : def : High 
02 : ghi : Low 
03 : jkl : Medium 
04 : mno : High 
05 : pqr : Medium 
06 : stu : High 
07 : vwx : Medium 
08 : yza : High 
09 : bcd : High 
10 : efg : High 
11 : hij : Critical 
12 : klm : Critical 
13 : nop : Medium 
14 : qrs : High 
15 : tuv : Critical 
'''.splitlines() 
data = [row.split(' : ') for row in data] 

grades = {'Critical': 1, 'High': 2, 'Medium': 3, 'Low': 4} 

data.sort(key=lambda t: (grades[t[2]], t[0])) 
for row in data: 
    print(' : '.join(row)) 

輸出

11 : hij : Critical 
12 : klm : Critical 
15 : tuv : Critical 
01 : def : High 
04 : mno : High 
06 : stu : High 
08 : yza : High 
09 : bcd : High 
10 : efg : High 
14 : qrs : High 
03 : jkl : Medium 
05 : pqr : Medium 
07 : vwx : Medium 
13 : nop : Medium 
00 : abc : Low 
02 : ghi : Low 
1

如果你可以改變你的表成大熊貓的數據幀(例如,使用pandas.read_csv),那麼這將做的工作:

import pandas as pd 
df=pd.DataFrame({'a':[1,2,3,4,5,6],'b':['a','b','c','d','e','f'],'val':['critical','high','low','medium','critical','low']}) 
df['val'] = pd.Categorical(df['val'],['critical','high','medium','low']) 
df.sort_values(by='val',inplace=True) 

然後在開始df

a b val 
0 1 a critical 
1 2 b high 
2 3 c low 
3 4 d medium 
4 5 e critical 
5 6 f low 

並且最後df

a b val 
0 1 a critical 
4 5 e critical 
1 2 b high 
3 4 d medium 
2 3 c low 
5 6 f low 

I上述N的代碼,即指定的順序線是使用IntEnum對於字典的列表

df['val'] = pd.Categorical(df['val'],['critical','high','medium','low']) 
2

實施例。

from enum import IntEnum 
class Vulnerability(IntEnum): 
    CRITICAL = 1 
    HIGH = 2 
    MEDIUM = 3 
    LOW = 4 

records = [] 
records.append({'v': Vulnerability.MEDIUM}) 
records.append({'v': Vulnerability.HIGH}) 
records.append({'v': Vulnerability.CRITICAL}) 
records.append({'v': Vulnerability.LOW}) 

print(records) 
# [{'v': <Vulnerability.MEDIUM: 3>}, {'v': <Vulnerability.HIGH: 2>}, {'v': <Vulnerability.CRITICAL: 1>}, {'v': <Vulnerability.LOW: 4>}] 

print(records[0]['v'] < records[1]['v']) 
# False 

print(sorted(records, key = lambda k: k['v'])) 
# [{'v': <Vulnerability.CRITICAL: 1>}, {'v': <Vulnerability.HIGH: 2>}, {'v': <Vulnerability.MEDIUM: 3>}, {'v': <Vulnerability.LOW: 4>}]