[英]How to sort lists that contain letters and numbers?
我嘗試了很多不同的方法來對列表進行排序,但它從來沒有對它進行排序。
list = ['american dad S1-EP1', 'american dad S1-EP10', 'american dad S1-EP11', 'american dad S1-EP12', 'american dad S1-EP13', 'american dad S1-EP14', 'american dad S1-EP15', 'american dad S1-EP16', 'american dad S1-EP17', 'american dad S1-EP18', 'american dad S1-EP19', 'american dad S1-EP2', 'american dad S1-EP20', 'american dad S1-EP21', 'american dad S1-EP22', 'american dad S1-EP23', 'american dad S1-EP3', 'american
dad S1-EP4', 'american dad S1-EP5', 'american dad S1-EP6', 'american dad S1-EP7', 'american dad S1-EP8', 'american dad S1-EP9']
我希望它們都井井有條,例如:ep1 ep2 ep3 ep4 ep5
我建議使用re
模塊來提取名稱、劇集、季節等key_function
將按Name
、 Season
、 Episode
對列表進行排序:
import re
pat = re.compile(r"(.*) S(\d+)-EP(\d+)")
def key_function(value):
name, season, episode = pat.search(value).groups()
return name, int(season), int(episode)
print(sorted(lst, key=key_function))
印刷:
[
"american dad S1-EP1",
"american dad S1-EP2",
"american dad S1-EP3",
"american dad S1-EP4",
"american dad S1-EP5",
"american dad S1-EP6",
"american dad S1-EP7",
"american dad S1-EP8",
"american dad S1-EP9",
"american dad S1-EP10",
"american dad S1-EP11",
"american dad S1-EP12",
"american dad S1-EP13",
"american dad S1-EP14",
"american dad S1-EP15",
"american dad S1-EP16",
"american dad S1-EP17",
"american dad S1-EP18",
"american dad S1-EP19",
"american dad S1-EP20",
"american dad S1-EP21",
"american dad S1-EP22",
"american dad S1-EP23",
]
通過使用找到答案:
list.sort(key=lambda x: int("".join([i for i in x if i.isdigit()])))
key
,它返回一個整數元組。 劇集將根據這些整數按升序排序。代碼:
import re
episodes = [
'american dad S1-EP1',
'american dad S1-EP10',
'american dad S1-EP11',
'american dad S1-EP12',
'american dad S1-EP13',
'american dad S1-EP14',
'american dad S1-EP15',
'american dad S1-EP16',
'american dad S1-EP17',
'american dad S1-EP18',
'american dad S1-EP19',
'american dad S1-EP2',
'american dad S1-EP20',
'american dad S1-EP21',
'american dad S1-EP22',
'american dad S1-EP23',
'american dad S1-EP3',
'american dad S1-EP4',
'american dad S1-EP5',
'american dad S1-EP6',
'american dad S1-EP7',
'american dad S1-EP8',
'american dad S1-EP9'
]
pattern = "S(\\d+)-EP(\\d+)"
def key(episode):
regex_match = re.search(pattern, episode)
return tuple(map(int, regex_match.groups()))
print(sorted(episodes, key=key))
Output:
['american dad S1-EP1', 'american dad S1-EP2', 'american dad S1-EP3', 'american dad S1-EP4', 'american dad S1-EP5', 'american dad S1-EP6', 'american dad S1-EP7', 'american dad S1-EP8', 'american dad S1-EP9', 'american dad S1-EP10', 'american dad S1-EP11', 'american dad S1-EP12', 'american dad S1-EP13', 'american dad S1-EP14', 'american dad S1-EP15', 'american dad S1-EP16', 'american dad S1-EP17', 'american dad S1-EP18', 'american dad S1-EP19', 'american dad S1-EP20', 'american dad S1-EP21', 'american dad S1-EP22', 'american dad S1-EP23']
>>>
嘗試使用帶鍵的sorted
function:
list1 = ['american dad S1-EP1', 'american dad S1-EP10', 'american dad S1-EP11', 'american dad S1-EP12', 'american dad S1-EP13', 'american dad S1-EP14', 'american dad S1-EP15', 'american dad S1-EP16', 'american dad S1-EP17', 'american dad S1-EP18', 'american dad S1-EP19',
'american dad S1-EP2', 'american dad S1-EP20', 'american dad S1-EP21', 'american dad S1-EP22', 'american dad S1-EP23', 'american dad S1-EP3', 'american dad S1-EP4', 'american dad S1-EP5', 'american dad S1-EP6', 'american dad S1-EP7', 'american dad S1-EP8', 'american dad S1-EP9']
def get_last_digits(s):
last_digits = s[s.index("P") + 1:]
return int(last_digits)
list1.sort(key=get_last_digits)
注意:這僅適用於所有劇集都是同一季的情況。
這里的大問題是您是否需要對小數進行排序。 假設您只關心整數(例如12.6
會出現在12.56
之前),那么您可以將字符串列表轉換為列表列表,其中列表中的每個項目都是字符串或 integer,然后對其進行排序:
import re
RE_NUM = re.compile(r'(\d+)|(\D+)')
def sort_mixed(strings):
# sort list of strings with integers embedded in them
split_strings = []
for string in strings:
split_string = [(int(i or 0), i or s) for i, s in RE_NUM.findall(string)]
split_strings.append(split_string)
return [''.join(s for _, s in v) for v in sorted(split_strings)]
# example usage
sort_mixed(['15.51', '12.9', '15.6.6', '15.6'])
# ['12.9', '15.6', '15.6.6', '15.51']
注意:與該線程中的其他答案不同,以上內容適用於整數和字符串的任意組合,包括無整數、無字符串或大於 1 的任意數量的整數。
您可以通過lambda
自定義排序鍵。 (順便說一句,避免將變量命名為 python 中的list
,因為它是保留字鏈接)
有關lambda的更多詳細信息,您可以查看鏈接
例子:
l = ['american dad S1-EP1', 'american dad S1-EP10', 'american dad S1-EP11', 'american dad S1-EP12', 'american dad S1-EP13', 'american dad S1-EP14', 'american dad S1-EP15', 'american dad S1-EP16', 'american dad S1-EP17', 'american dad S1-EP18', 'american dad S1-EP19', 'american dad S1-EP2', 'american dad S1-EP20', 'american dad S1-EP21', 'american dad S1-EP22', 'american dad S1-EP23', 'american dad S1-EP3', 'american dad S1-EP4', 'american dad S1-EP5', 'american dad S1-EP6', 'american dad S1-EP7', 'american dad S1-EP8', 'american dad S1-EP9']
sorted_l = sorted(l, key=lambda x: int(x.split("-EP")[1]))
print(sorted_l)
或者,python 可以根據另一個列表中的值對一個列表進行排序(查看鏈接)。 您可以創建一個新列表,其中僅包含 ep 編號。
例子:
l = ['american dad S1-EP1', 'american dad S1-EP10', 'american dad S1-EP11', 'american dad S1-EP12', 'american dad S1-EP13', 'american dad S1-EP14', 'american dad S1-EP15', 'american dad S1-EP16', 'american dad S1-EP17', 'american dad S1-EP18', 'american dad S1-EP19', 'american dad S1-EP2', 'american dad S1-EP20', 'american dad S1-EP21', 'american dad S1-EP22', 'american dad S1-EP23', 'american dad S1-EP3', 'american dad S1-EP4', 'american dad S1-EP5', 'american dad S1-EP6', 'american dad S1-EP7', 'american dad S1-EP8', 'american dad S1-EP9']
ep_list = [int(x.split("-EP")[1]) for x in l]
sorted_l = [x for _, x in sorted(zip(ep_list, l))]
print(sorted_l)
output:
['american dad S1-EP1', 'american dad S1-EP2', 'american dad S1-EP3', 'american dad S1-EP4', 'american dad S1-EP5', 'american dad S1-EP6', 'american dad S1-EP7', 'american dad S1-EP8', 'american dad S1-EP9', 'american dad S1-EP10', 'american dad S1-EP11', 'american dad S1-EP12', 'american dad S1-EP13', 'american dad S1-EP14', 'american dad S1-EP15', 'american dad S1-EP16', 'american dad S1-EP17', 'american dad S1-EP18', 'american dad S1-EP19', 'american dad S1-EP20', 'american dad S1-EP21', 'american dad S1-EP22', 'american dad S1-EP23']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.