2017-06-28 87 views
1

剛開始在python上工作並且難以通過多次/不同數量的匹配對字符串列表進行排序。基本上,給定一個字符串列表,我需要通過給定的正則表達式(用戶提供)分割每個字符串,然後按給定的鍵列表(位置)進行排序。密鑰可以是單個整數,也可以按排序順序排列。例如:使用正則表達式使用正則表達式的python排序列表使用不同數量的模式匹配的正則表達式

regex = r'。 (FF | TT | SS)_([ - 。\ d] + v)_([ - 。\ d] + c)_(FF | TT | SS)。

鍵= [2,1,3]

會通過LOCATION2,LOCATION1,LOCATION3排序字符串列表。

我有固定數量的位置/鍵的作品以下,但不能弄清楚如何讓它變「鑰匙」的數量的工作:

import re 

strlist = ["synopsys_SS_2v_-40c_SS.lib","synopsys_SS_1v_-40c_SS.lib","synopsys_SS_2v_-40c_TT.lib","synopsys_FF_3v_-40c_FF.lib", "synopsys_TT_4v_125c_TT.lib", "synopsys_TT_1v_-40c_TT.lib"] 
regex = r'.*(FF|TT|SS)_([-\.\d]+v)_([-\.\d]+c)_(FF|TT|SS).*' 
key = [2,1,3] 

sfids_single = sorted(strlist, key=lambda name: ( 
    re.findall(regex,name)[0][key[0]], 
    re.findall(regex,name)[0][key[1]], 
    re.findall(regex,name)[0][key[2]])) 

試過以下,但它似乎不工作:

fids_single = sorted(strlist, key=lambda name: (re.findall(regex,name)[0][i] for i in key)) 

也試過(W/O成功):

for i in key: 
    strlist.sort(key=lambda name: re.findall(regex,name)[0][key[i]]) 

預期[R成績:

['synopsys_SS_1v_-40c_SS.lib', 'synopsys_TT_1v_-40c_TT.lib', 'synopsys_SS_2v_-40c_SS.lib', 'synopsys_SS_2v_-40c_TT.lib', 'synopsys_FF_3v_-40c_FF.lib', 'synopsys_TT_4v_125c_TT.lib'] 

我在錯誤的軌道上完全嗎?任何指導非常感謝。

+0

你有麻煩拆分字符串或排序結果列表? – wwii

+0

你能展示一個期望的輸出樣本嗎? –

+0

這是一個功課問題嗎? – wwii

回答

1

非常感謝@a_guest提供的謎題缺失的一塊。這裏的工作解決方案:

fids_single = sorted(strlist, key=lambda name: tuple(re.findall(regex,name)[0][i] for i in key)) 
2

編寫一個鍵函數,該函數將按優先順序返回每個字符串的相關部分,並將該函數用於排序鍵。

one = ["synopsys_SS_2v_-40c_SS.lib","synopsys_SS_1v_-40c_SS.lib", 
     "synopsys_SS_2v_-40c_TT.lib","synopsys_FF_3v_-40c_FF.lib", 
     "synopsys_TT_4v_125c_TT.lib", "synopsys_TT_1v_-40c_TT.lib"]  

expected = ['synopsys_SS_1v_-40c_SS.lib', 'synopsys_TT_1v_-40c_TT.lib', 
      'synopsys_SS_2v_-40c_SS.lib', 'synopsys_SS_2v_-40c_TT.lib', 
      'synopsys_FF_3v_-40c_FF.lib', 'synopsys_TT_4v_125c_TT.lib'] 

使用您的正則表達式來拆分字符串;

import operator, re 
pattern = r'.*(FF|TT|SS)_([-\.\d]+v)_([-\.\d]+c)_(FF|TT|SS).*' 
rx = re.compile(pattern) 
seq = [2,1,3] 
def key(item, seq = seq): 
    seq = operator.itemgetter(*seq) 
    a, b, c, d = rx.findall(item) 
    return seq([a, b, c, d]) 


one.sort(key = key) 
assert one == expected 

的關鍵功能可以在不使用一個正則表達式可以使它有點不太複雜的寫入。

def key(item, seq = seq): 
    seq = operator.itemgetter(*seq) 
    _, a, b, c, d = item.split('_') 
    d, _ = d.split('.') 
    print a, b, c, d 
    return seq([a, b, c, d]) 

您可能希望使用比a, b, c, d更具描述性的名稱。它依賴於具有相同的模式的字符串。

+0

我看不出如何將其應用於我的代碼。 – Luca

+1

@Kidneys你第一次嘗試'for i in key'幾乎是正確的,但是你使用的表達式返回一個生成器。對於你想使用'tuple'的排序鍵來代替。所以通過使用'lambda name:tuple(... for i in key)'它應該可以工作。 –

+0

@Kidneys - 解決方案已更正。 – wwii

相關問題