我試圖對一個串列進行排序,同時尊重原始排序順序并保持其 "邏輯完整性"--例如,如果一個元素在最右邊,那么在排序時它將移到最左邊。這里的背景是為了使LDAP的排序與x509證書兼容。
一個元素的distinguishedName在LDAP中看起來如下。CN=John Doe,OU=Marketing,OU=Users,DC=contoso,DC=loc,但證書要求其名稱以下列格式保存 DC=loc,DC=contoso,OU=Users,OU=Marketing,CN=John Doe。
因為我想在用戶添加正常的x509證書時提供一些錯誤冗余,我想出了一個簡單的排序來規范用戶輸入,例如:OU=Tech,ST=Berlin,C=DE,CN=test.com變成C=DE,ST=Berlin,OU=Tech,CN=test. com;但是當決議 LDAP distinguishedNames 時,我遇到了一些問題 - 它沒有保持 DCs 和 OUs 的 原始排序邏輯。
我的代碼看起來是這樣的:
SUBJECT_FIELDS = [
"DC"/span>。
"C"。
"ST"。
"L"。
"O"。
"OU"。
"CN"。
"emailAddress"。
]
def sort_name(subject)。
return sorted(subject, key=lambda e: SUBJECT_FIELDS.index(e[0] )
>>> subject = [('CN', 'John Doe'), ('OU', ' Users'), ('DC', 'contoso'), ('DC', 'loc') ]
>>> sort_name(subject)
[('DC', 'contoso'), ('DC', 'loc') 。('OU', 'Users'), ('CN', 'John Doe') ]
# should be [('DC', 'loc'), ('DC', 'contoso'), ('OU', 'Users'), ('CN', 'John Doe')]/span>
>>> subject = [('CN'/span>, 'John Doe'/span>), ('OU'/span>, 'Marketing'), ('OU', ' Users')。('OU', 'OtherUnit'), ('DC', 'contoso'), ('DC', 'loc') ]
>>> sort_name(subject)
[('DC'/span>, 'contoso'/span>), ('DC'/span>, 'loc'), ('OU', 'Marketing')。('OU', '用戶'), ('OU', 'OtherUnit'), ('CN', 'John Doe') ]
# should be [('DC', 'loc'), ('DC', 'contoso'), ('OU', 'OtherUnit'), ('OU', 'Users'), ('OU', 'Marketing'), ('CN', 'John Doe')]/span>
>>> subject = [('DC', 'loc'), ('DC', 'contoso'), ('DC', 'ad'), ('OU', 'Users'), ('CN', 'John Doe') ]
>>> sort_name(subject)
[('DC', 'loc'), ('DC', 'contoso'), ('DC', 'ad'), ('OU', 'Users'), ('CN', 'John Doe') ]
# works as intended
>>> subject = [('OU', 'Users'), ('CN', 'John Doe'), ('DC', 'contoso'), ('DC', 'loc') ]
>>> sort_name(subject)
[('DC', 'contoso'), ('DC', 'loc') 。('OU', 'Users'), ('CN', 'John Doe') ]
# 可能永遠不會發生有人把一個OU搞成這樣,但應該是:。
# [('DC', 'loc'), ('DC', 'contoso'), ('OU', 'Users'), ('CN', 'John Doe')]/span>
因此,問題在于 sorted 無法 "逆轉 "同一排序-key的多次出現,從而搞砸了名稱的原始邏輯完整性。
我已經嘗試了擴展sorted函式,根據主題欄位在串列開始或結束時的位置進行加權排序。
def sort_name(subject)。
half_index = len(subject) // 2。
relative_index = lambda x: len(subject) - subject.index(x)
if subject.index(x) 1 > half_index
else subject.index(x) - len(subject)
sorted_fields = sorted(subject, key=lambda e: (SUBJECT_FIELDS.index(e[0), relative_index(e))
return sorted(subject, key=lambda e: (SUBJECT_FIELDS.index(e[0]), relative_index(e))
但不幸的是,這似乎涉及到更多意外的結果。
uj5u.com熱心網友回復:
嘗試:
def sort_func(s)。
return [
t
for _, t in sorted(
enumerate(s),
key=lambda k: (SUBJECT_FIELDS.index(k[1][0]), -k[0]。
)
]
主體=[[
("CN", "John Doe") 。
("OU", "用戶"),
("DC", "contoso") 。
("DC", "loc")。
]
print(sort_func(subject))
列印:
[('DC', 'loc'), ('DC', 'contoso'), ('OU', 'Users'), ('CN', 'John Doe') ]
其他
其他主題s:
subject = [
("CN", "John Doe"),
("OU", "Marketing"),
("OU","用戶")。
("OU", "OtherUnit"),
("DC", "contoso"),
("DC", "loc"),
]
print(sort_func(subject))
主題 = [
("OU", "Users"),
("CN", "John Doe"),
("DC", "contoso"),
("DC", "loc"),
]
print(sort_func(subject))
主題 = [
("DC", "ad"),
("DC", "contoso"),
("DC", "loc"),
("OU", "Users"),
("CN", "John Doe"),
]
print(sort_func(subject))
列印:
[('DC', 'loc']。('DC', 'contoso'), ('OU', 'OtherUnit'), ('OU', ' Users'), ('OU', 'Marketing'), ('CN', 'John Doe')]
[('DC', 'loc'), ('DC', 'Contoso')。('OU', 'Users'), ('CN', 'John Doe') ]
[('DC', 'loc'), ('DC', 'contoso'), ('DC', 'ad'), ('OU', 'Users'), ('CN', 'John Doe') ]
編輯2:
SUBJECT_FIELDS = [
"DC"/span>。
"C"。
"ST"。
"L"。
"O"。
"OU"。
"CN"。
"emailAddress"。
]
def sort_func(s)。
if SUBJECT_FIELDS.index(s[0][0]) > SUBJECT_FIELDS。 index(s[-1][0]) 。
return sorted(s[::-1], key=lambda k。SUBJECT_FIELDS.index(k[0] ))
return sorted(s, key=lambda k: SUBJECT_FIELDS.index(k[0] )
主題 = [...
("CN", "John Doe") 。
("OU", "用戶"),
("DC", "contoso") 。
("DC", "loc")。
]
print(sort_func(subject))
主題 = [
("CN", "John Doe") 。
("OU", "營銷")。
("OU", "用戶")。
("OU", "OtherUnit") 。
("DC", "contoso") 。
("DC", "loc")。
]
print(sort_func(subject))
主題 = [
("DC", "loc") 。
("DC", "contoso") 。
("DC", "ad") 。
("OU", "用戶")。
("CN", "John Doe")。
]
print(sort_func(subject))
主題 = [
("OU", "用戶")。
("CN", "John Doe") 。
("DC", "contoso") 。
("DC", "loc")。
]
print(sort_func(subject))
主題 = [
("DC", "loc") 。
("DC", "contoso") 。
("CN", "John Doe") 。
("OU", "用戶")。
]
print(sort_func(subject))
列印:
[('DC', 'loc'), ('DC', 'contoso'), ('OU', ' Users'), ('CN', 'John Doe')]
[('DC', 'loc'), ('DC', 'contoso'), ('OU', 'OtherUnit'), ('OU', 'Users'), ('OU', 'Marketing'), ('CN', 'JohnDoe')]
[('DC', 'loc'), ('DC', 'contoso'), ('DC', 'ad'), ('OU', 'Users'), ('CN', 'JohnDoe')]
[('DC', 'loc'), ('DC', 'contoso'), ('OU', 'Users'), ('CN', 'John Doe')]
[('DC', 'loc'), ('DC', 'contoso'), ('OU', 'Users'), ('CN', 'John Doe')]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/332544.html
標籤:
上一篇:做作業的AWS服務
