2016-07-01 10 views
1

'b'のすべての要素について、 'a'からその値を見つけて、結果のリストに入れる必要があります。 「」私はなし対応する値がない場合、リストにNoneを追加する方法はありますか?

例置く必要で保管し、該当する値が存在しない場合:

getValues([("key1", "value1"), ("key2", "value2"), ("key3", "value3")], ["key2","key3","key3","key4","key1","key5"]) 

は、それがリストにNoneを追加しませんようにコードを修正する方法["value2", "value3", "value3", None, "value1", None]

を返す必要がありますそれはどこにあるのですか?

def getValues(a, b): 
    result = [] 
    for i in range(len(b)): 
      for n in range(len(a)): 
        if b[i] == a[n][0]: 
          result.append(a[n][1]) 
    return result 

どこに追加するかについての条件を入れようとしたところ、正しく動作しませんでした。

答えて

2

コードから始めて、aで何かを見つけたかどうかを調べる必要があります。あなたが一致を見つけると、内側のループからbreakすることができます。そうすれば、あなたが代わりにNoneを使用する必要があることを把握するfor..else構文を使用することができます。

def getValues(a, b): 
    result = [] 
    for i in range(len(b)): 
     for n in range(len(a)): 
      if b[i] == a[n][0]: 
       result.append(a[n][1]) 
       break 
     else: 
      result.append(None) 
    return result 

しかし、b内のすべての項目についてaをループするような高価です。 aは本質的にルックアップであるため、辞書に変換することを検討する必要があります。 aはキー/値タプルのリストなので、これはかなり簡単です。 dict(a)に電話するだけです。キーがでない場合は代わりの項目が辞書にあるかどうかをチェックする

def getValues(a, b): 
    result = [] 
    d = dict(a) 
    for i in range(len(b)): 
     if b[i] in d: 
      result.append(d[b[i]]) 
     else: 
      result.append(None) 
    return result 

、あなたはまた、代わりにdict.get()を使用することができ、デフォルト値を返します。

その後は、内側のループを削除することができます辞書。

def getValues(a, b): 
    result = [] 
    d = dict(a) 
    for i in range(len(b)): 
     result.append(d.get(b[i])) 
    return result 

は最後に、代わりにインデックスを反復処理のため、あなたはbのリスト項目を反復処理する必要があります:

def getValues(a, b): 
    result = [] 
    d = dict(a) 
    for x in b: 
     result.append(d.get(x)) 
    return result 

をあなただけの代わりにこれを行うことができますので、デフォルトでは、(どのように便利)Noneです

def getValues(a, b): 
    d = dict(a) 
    return [d.get(x) for x in b] 
+0

私の間違いの1つはif条件の下に「else:result.append(None)」を置くことでした。ありがとうございました! –

2
>>> [dict(a).get(el) for el in b] 
['value2', 'value3', 'value3', None, 'value1', None] 
+1

@MosesKoledoye:あなたはb内のすべての項目についての項目を追加するので、あなたも素敵なリスト内包することによって、これを置き換えることができます 'NONE'がDEFであります'dict.get()'の値は既にあります。 –

+1

'bict 'のすべての項目について新しい辞書を作成しないようにするには、リストの理解の範囲外で' dict(a) 'を動かすことを検討するべきです。 – poke

+0

辞書は次のトピック(私はちょうどプログラミング方法を学び始めたので)私はそれを見ずに問題を解決するように言われた。辞書に適用せずにコードを修正する他の方法はありますか? –

関連する問題