我想如何訂購我的清單:
- isRegular = 真
- 粗體 = 真
- 斜體 = 真
- 最接近的重量值。在我的示例中,我想要最接近 400 的值。
我的串列包含這些 NamedTuple:
class Font(NamedTuple):
fontPath: str
fontName: str
isRegular: bool
bold: bool
italic: bool
weight: int
這是我現在的排序方式(這不好)
fontMatch.sort(key=lambda font: (-font.isRegular, -font.bold, -font.italic, -abs(400 - font.weight)))
輸入
[
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY Thin_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=False, bold=False, italic=False, weight=250),
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY Light_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=False, bold=False, italic=False, weight=300),
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY Medium_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=False, bold=False, italic=False, weight=500),
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY Regular_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=True, bold=False, italic=False, weight=400),
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY ExtraBold_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=False, bold=False, italic=False, weight=800),
Font(fontPath='C:\\Windows\\Fonts\\Deleted\\MADE TOMMY BOLD_PERSONAL USE.OTF', fontName='MADE TOMMY', isRegular=False, bold=True, italic=False, weight=700),
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY Black_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=False, bold=False, italic=False, weight=900),
]
我目前擁有的輸出(如果我嘗試多次運行代碼,它會給我不同的輸出。我不知道為什么會這樣。這是我可以獲得的 2 個輸出示例)
# Output 1
[
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY Regular_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=True, bold=False, italic=False, weight=400),
Font(fontPath='C:\\Windows\\Fonts\\Deleted\\MADE TOMMY BOLD_PERSONAL USE.OTF', fontName='MADE TOMMY', isRegular=False, bold=True, italic=False, weight=700),
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY Thin_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=False, bold=False, italic=False, weight=250),
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY Light_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=False, bold=False, italic=False, weight=300),
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY Black_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=False, bold=False, italic=False, weight=900),
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY Medium_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=False, bold=False, italic=False, weight=500),
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY ExtraBold_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=False, bold=False, italic=False, weight=800)
]
# Output 2
[
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY Regular_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=True, bold=False, italic=False, weight=400),
Font(fontPath='C:\\Windows\\Fonts\\Deleted\\MADE TOMMY BOLD_PERSONAL USE.OTF', fontName='MADE TOMMY', isRegular=False, bold=True, italic=False, weight=700),
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY Black_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=False, bold=False, italic=False, weight=900),
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY ExtraBold_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=False, bold=False, italic=False, weight=800),
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY Thin_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=False, bold=False, italic=False, weight=250),
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY Medium_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=False, bold=False, italic=False, weight=500),
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY Light_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=False, bold=False, italic=False, weight=300),
]
這是我想要的輸出
[
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY Regular_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=True, bold=False, italic=False, weight=400),
Font(fontPath='C:\\Windows\\Fonts\\Deleted\\MADE TOMMY BOLD_PERSONAL USE.OTF', fontName='MADE TOMMY', isRegular=False, bold=True, italic=False, weight=700),
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY Medium_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=False, bold=False, italic=False, weight=500),
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY Light_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=False, bold=False, italic=False, weight=300),
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY Thin_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=False, bold=False, italic=False, weight=250),
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY ExtraBold_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=False, bold=False, italic=False, weight=800),
Font(fontPath='C:\\Windows\\Fonts\\MADE TOMMY Black_PERSONAL USE.otf', fontName='MADE TOMMY', isRegular=False, bold=False, italic=False, weight=900)
]
uj5u.com熱心網友回復:
list.sort()默認為升序。你不需要做-abs(400 - font.weight)。去掉前面的負號即可:
fontMatch.sort(key=lambda font: (-font.isRegular, -font.bold, -font.italic, abs(400 - font.weight)))
注意:對于300和500(與400距離相等)的情況,300會排在最前面,因為它是按升序排列的。如果你想要它反過來,-font.weight像這樣包含在元組中:
fontMatch.sort(key=lambda font: (-font.isRegular, -font.bold, -font.italic, abs(400 - font.weight), -font.weight))
uj5u.com熱心網友回復:
定義一個老式的比較函式,functools.cmp_to_key它將變成一個適當的鍵函式。
from functools import cmp_to_key
def compare(f1, f2):
if f1.isRegular and f2.isRegular:
if f1.bold and f2.bold:
if f1.italic and f2.italic:
d1 = abs(f1.weight - 400)
d2 = abs(f2.weight - 400)
return f1 if d1 <= d2 else f2
else:
return f1 if f1.italic else f2
else:
return f1 if f1.bold else f2
else:
return f1 if f2.bold else f2
fontMatch.sort(key=cmp_to_key(compare))
compare至少可以說有點冗長。您可能希望根據 Python 2 的舊cmp函式來定義它,在這里簡單地重新定義。
def cmp(x, y):
return -1 if x < y else 0 if x == y else 1
def compare(f1, f2, w=400):
# Since False < True, we swap the order of the arguments
# for the boolean fields.
return (cmp(f2.isRegular, f1.isRegular)
or cmp(f2.bold, f1.bold)
or cmp(f2.italic, f1.italic)
or cmp(abs(f1.weight - w), abs(f2.weight - w)))
將目標權重引數化后,您可以使用
fontMatch.sort(key=cmp_to_key(compare))
fontMatch.sort(key=cmp_to_key(lambda x, y: compare(x,y,700))
# etc
你也可以考慮一個只需要權重的工廠函式:
def make_compare(w=400):
def compare(x, y):
return (cmp(f2.isRegular, f1.isRegular)
or cmp(f2.bold, f1.bold)
or cmp(f2.italic, f1.italic)
or cmp(abs(f1.weight - w), abs(f2.weight - w)))
fontMatch.sort(key=cmp_to_key(make_compare()))
fontMatch.sort(key=cmp_to_key(make_compare(700)))
# etc
使用比較函式可以讓您更精確地了解每個欄位的排序,而不必求助于否定技巧(無論如何它只適用于數字欄位)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/462161.html
