[英]Pythonic way to sort the records with multiple columns
假设我们以以下方式在文件中有很多记录。
10.10.10.10(tcp/443) : Some SSL Vulnerability : Medium : Patched
10.10.10.11(tcp/888) : Some RCE Vulnerability : High : Not Patched
这些记录的第3列的值为Critical, High, Medium, Low
。
用这种方式对这些记录进行排序的最好的pythonic方法是:1.关键,2。高,3。中4.低?
使用IntEnum
作为字典列表的示例。
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>}]
如果您可以将表转换为pandas数据框(例如,使用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
在上面的代码中,指定顺序的行是
df['val'] = pd.Categorical(df['val'],['critical','high','medium','low'])
这是一个纯Python解决方案,使用字典将Critical, High, Medium, Low
字符串转换为其数值; 该数字值用作list.sort
的排序键函数参数。 我的键功能还将每个记录的第一个字段用作辅助排序键,以便在按等级排序的每个部分中,条目也按该第一个字段排序。
由于您的问题仅包含两行样本数据,因此我构建了一些简单的伪数据。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.