2016-12-31 58 views
-1

我有一個這樣的名單:通過檢查的一部分列表中的替換項

[item1(130.35),item2(140.10),item2(140.25),item2(130.05)] 

我想通過檢查其號碼的第一個數字來代替的東西從另一個列表中不同的每個項目。 例如所有130S replaceditem1,所有140S replaceditem2:

[replaceditem1,replaceditem2,replaceditem2,replaceditem1] 
+0

這是不是很清楚你想要什麼,但也許'[replaceitem1 if i == 130 else replaceditem2 if i == 140 else i for i in lst]'? –

+0

創建新的空列表,並使用for-loop從舊列表中獲取每個元素,並檢查它是否具有「130」或「140」,然後添加到新列表「replaiteitem1」或「replaceditem2」 – furas

+0

什麼是實際列表的樣子?是'item1(130.35)'調用'item1()'還是像''item1(130.35)「'這樣的字符串? – ernie

回答

2

的想法是:

  • 定義的正則表達式來提取所需的數字 - item\d+\((\d+)\.\d+\)將工作這組輸入
  • 定義替換字典(將有助於保持替換邏輯清潔,並且如果您需要縮放解決方案)
  • 迭代列表中的所有項目,提取數字並查看是否有替換已廢除了許多 - 如果不是,我們只是添加不變的項目

演示:

>>> l = ["item1(130.35)", "item2(140.10)", "item2(140.25)", "item2(130.05)"] 

>>> import re 

>>> pattern = re.compile(r"item\d+\((\d+)\.\d+\)") 

>>> replacements = { 
...  '130': 'replaceditem1', 
...  '140': 'replaceditem2' 
... } 

>>> result = [] 

>>> for item in l: 
...  match = pattern.match(item) 
...  if match: 
...   result.append(replacements.get(match.group(1), item)) 
...  else: 
...   result.append(item) 

>>> result 
['replaceditem1', 'replaceditem2', 'replaceditem2', 'replaceditem1'] 

讓我們在正則表達式:

  • \d+匹配一個或更多連續數字
  • \( and \) would matc^h字面打開和關閉括號 - 需要轉義,因爲他們有特殊的意義
  • \.將匹配一個點
  • (\d+)捕獲組將捕獲一個或多個連續數字
+0

在item1(130.35)是函數調用而不是字符串的情況下呢? –

+0

顯然,OP剛剛選擇了你的答案,所以我上面的評論是無關緊要的。 +1 –

+0

@leaf是的,我認爲OP有這些項目作爲字符串,看起來像假設是正確的。謝謝。 – alecxe