2015-06-25 108 views
1

我有一個列表類似下面的子字符串進行排序的名單:基於每個字符串

a = ['e8:04:62:23:57:d0\t2462\t-55\t[WPA2-PSK-CCMP][ESS]\tTest', '00:1b:2f:48:8b:f2\t2462\t-57\t[WPA2-PSK-CCMP-preauth][ESS]\tT_test', 'e8:04:62:23:4e:70\t2437\t-61\t[WPA2-PSK-CCMP][ESS]\tT_guest', 'e8:04:62:23:57:d1\t2462\t-53\t[ESS]\t', 'e8:04:62:23:4e:71\t2437\t-56\t[ESS]\t'] 

我要作爲排序依據的數字每個元素的第三個選項卡後的名單,所以在這種情況下 - 55,-57,-61,-53應將列表順序更改爲-53,-55,-57,-61。我嘗試過的任何方式似乎都很複雜(列出清單等)。我應該使用正則表達式/模式來簡化它嗎?

回答

4

您可以在自定義拉姆達這裏傳遞給sorted函數來獲得期望的結果:

>>> a = ['e8:04:62:23:57:d0\t2462\t-55\t[WPA2-PSK-CCMP][ESS]\tTest', '00:1b:2f:48:8b:f2\t2462\t-57\t[WPA2-PSK-CCMP-preauth][ESS]\tT_test', 'e8:04:62:23:4e:70\t2437\t-61\t[WPA2-PSK-CCMP][ESS]\tT_guest', 'e8:04:62:23:57:d1\t2462\t-53\t[ESS]\t', 'e8:04:62:23:4e:71\t2437\t-56\t[ESS]\t'] 
>>> sorted(a, key = lambda x: int(x.split("\t")[2]), reverse=True) 
['e8:04:62:23:57:d1\t2462\t-53\t[ESS]\t', 'e8:04:62:23:57:d0\t2462\t-55\t[WPA2-PSK-CCMP][ESS]\tTest', 'e8:04:62:23:4e:71\t2437\t-56\t[ESS]\t', '00:1b:2f:48:8b:f2\t2462\t-57\t[WPA2-PSK-CCMP-preauth][ESS]\tT_test', 'e8:04:62:23:4e:70\t2437\t-61\t[WPA2-PSK-CCMP][ESS]\tT_guest'] 
+1

謝謝你,那是簡潔得多,比我做了什麼「Python化」。 – Paul

+1

不要忘記使用'int'。(獲取詞法順序的順序) – Kasramvd

+1

這個解決方法是越野車,你必須將它轉換爲'int'閱讀此問題:http://stackoverflow.com/questions/3270680/how -does-python-compare-string-and-int – Elisha

1
def make_sorted_list(l): 
    sorted_list = [] 
    sorted_vals = sorted([int(s.split('\t')[2]) for s in l], reverse=True) 
    for val in sorted_vals: 
     for s in l: 
      if int(s.split('\t')[2]) == val: 
       sorted_list.append(s) 
    return sorted_list