2017-08-01 30 views
3

我有兩個元組列表(項目名稱,版本) - 一個包含所有當前項目,另一個包含要導入的項目。如果在導入和當前項目之間存在名稱衝突,我想返回更新的版本。我的解決辦法是:Python - 在元組列表中比較項目

currentItemVersion = [("ItemA", "001"), ("ItemB", "002"), ("Camera", ""), ("SHD_metal", "001"), ("SHD_wood", "002")] 
importItemVersion = [("ItemB", "001"), ("Camera", "001"), ("SHD_metal", "002"), ("SHD_wood", "004")] 

def updateItems(currentItems, importItems): 
    updatedItems = [] 
    for i, v in currentItemVersion: 
     if i in [n[0] for n in importItemVersion]: 
      ni, nv = importItemVersion[[n[0] for n in importItemVersion].index(i)] 
      nvInt = int(nv) if nv else -1 
      vInt = int(v) if v else -1 
      if nvInt > vInt: 
       updatedItems.append((ni, nv)) 
      elif nvInt == vInt: 
       updatedItems.append((ni, nv)) 
      else: 
       updatedItems.append((i, v)) 
     else: 
      print('item {0} was not imported'.format(i)) 
      updatedItems.append((i, v)) 
    return updatedItems 

print(updateItems(currentItemVersion, importItemVersion)) 

我想知道是否有這個一個更好的解決方案,尤其是在離線7 & 8.可我不知檢查

if i in [n[0] for n in list] 

和[1]在單個n返回操作?

+7

如果這個工程的時候趕上例外,你想獲得對代碼和執行反饋,你應該把它代碼審查 – jacoblaw

+0

我不知道這個選項,謝謝你轉發我! – nuki

回答

1

您可以使用字典和更新的項目一個接一個,而由一個已經在字典如果有檢查版本,例如:

currentItemVersion = [("ItemA", "001"), ("ItemB", "002"), ("Camera", ""), ("SHD_metal", "001"), ("SHD_wood", "002")] 
importItemVersion = [("ItemB", "001"), ("Camera", "001"), ("SHD_metal", "002"), ("SHD_wood", "004")] 

def updateItems(currentItems, importItems): 
    updated = {} 
    for item, ver in currentItems + importItems: 
     try: 
      if int(ver) > int(updated.get(item, 0)): 
       updated[item] = ver 

     except ValueError: 
      updated[item] = ver 

    return updated 

print updateItems(currentItemVersion, importItemVersion) 

輸出:

{'ItemB': '002', 'ItemA': '001', 'Camera': '001', 'SHD_wood': '004', 'SHD_metal': '002'} 

dict.get(item, 0)如果item是有效密鑰則返回版本,否則返回0。 比較之前,您可能想要將演員版本輸入int()

編輯:

新增int()型投+ try/except來試圖強制類型轉換""int()

+0

這是一個非常好的解決方案,謝謝! – nuki

+0

很高興幫助! –

+0

其實如果你想避免類型轉換,你可以把它們保留爲字符串 – maxymoo

2

使用dict代替,這樣你就不需要找到與內部循環的關鍵衝突,並將複雜度從O(m * n)降低到O(m)。

+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 - [來自評論](/ review/low-quality-posts/16903309) – ppperry