簡體   English   中英

考慮兩個不同標准的字符串排序列表

[英]Sort list of strings considering two different criteria

我有以下列表:

l = ['hey (0)', 'hey (1)', 'bye (3)', 'bye (1)']

我想先按數字字符排序,然后按字母順序

output 應該是:

l = ['hey (0)','bye (1)', 'hey (1)', 'bye (3)']

試過:

l.sort(key = lambda x: (x[-2], x[1]))

有任何想法嗎?

你的方法幾乎是正確的。 一個錯誤是x[1]按第二個字母而不是第一個字母對具有相同數值的元素進行排序。

您的解決方案也可以很好地推廣到其他輸入。 例如,它可能會在"product (5)" "produce (5)" ,因為您沒有查看單詞中的所有字母。

您應該使用字符串的整個開頭( x[:-4]將切斷數字、括號和空格),並可選擇將數字轉換為整數:

>>> l = ['hey (0)', 'hey (1)', 'bye (3)', 'bye (1)']
>>> l.sort(key=lambda x: (int(x[-2]), x[:-4]))
>>> l
['hey (0)', 'bye (1)', 'hey (1)', 'bye (3)']

這仍然不完全通用 - 例如,它僅在數字保證為 0 到 9 之間的整數時才有效,否則"foo (11)"可能看起來小於"foo (9)" 在這種情況下,您可能想要使用更像 azro 解決方案的東西。

您需要更精確x[-2]采用數字(但作為字符串),但x[1]采用第二個字符,您需要整個單詞,正則表達式可以很好地做到這一點

import re
pattern = re.compile("(\w+) \((\d+)\)")
def sorter(value):
    text, nb = pattern.findall(value)[0]
    return int(nb), text

l = ['hey (0)', 'hey (1)', 'bye (3)', 'bye (1)']
l.sort(key=sorter)
print(l)  # ['hey (0)', 'bye (1)', 'hey (1)', 'bye (3)']

或者沒有正則表達式

def sorter(value):
    text, nb = value.split(" ")
    return int(nb.strip("()")), text

l = ['hey (0)', 'hey (1)', 'bye (3)', 'bye (1)']
l.sort(key=sorter)
print(l)  # ['hey (0)', 'bye (1)', 'hey (1)', 'bye (3)']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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