簡體   English   中英

如何對包含字母和數字的列表進行排序?

[英]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將按NameSeasonEpisode對列表進行排序:

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()])))
  1. 創建一個包含兩個捕獲組的正則表達式模式 - 一個用於季號,一個用於劇集號。
  2. 為排序 function 定義一個自定義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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM