2017-08-01 18 views
3

タプルの2つのリスト(アイテム名、バージョン)があります.1つは現在のアイテムをすべて含み、もう1つはインポートするアイテムです。インポートされたアイテムと現在のアイテムの間に名前の衝突がある場合、新しいバージョンを返すことにします。私のソリューションは、次のとおりです。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

これが動作する場合に""をキャストタイプしようとしたときtry/exceptは、例外をキャッチすると、あなたがそれを取る必要があり、コードや実装上のフィードバックを取得したいですコードレビュー – 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)は、アイテムが有効なキーの場合はバージョンを返し、そうでない場合は0を返します。 比較する前に、キャストバージョンをint()に入力します。

編集:

追加int()型キャスト+ int()

+0

これは本当に素晴らしい解決策です、ありがとうございます! – nuki

+0

うれしかった! –

+0

実際に型キャストを避けたいのであれば、文字列としてそのまま残すことができます。 – maxymoo

2

代わりにdictを使用してください。そうすれば、内側のループでキーの衝突を見つける必要がなくなり、複雑さをO(m * n)からO(m)に減らすことができます。利用可能な場合は辞書にすでにあるもので、バージョンを確認しながら

+0

これは質問に対する答えを提供しません。批評をしたり、著者の説明を求めるには、投稿の下にコメントを残してください。 - [レビューの投稿](レビュー/低品質の投稿/ 16903309) – ppperry

関連する問題