あなたのコードはうまく機能しているようです:
>>> FList = ["Mary Smith", "Kevin Bacon"]
>>> JG = [[3928, "Mary Smith"], [2920, "Jacob Francis"], [7777, "Kevin Bacon"]]
>>> ultralist = []
>>> for item in FList:
for row in JG:
if row[1] == item:
ultralist.append(row)
>>> ultralist
[[3928, 'Mary Smith'], [7777, 'Kevin Bacon']]
なにが問題だったの?
私がそれに取り組んでいる間、これはそれを行うためのより良い方法でしょう。forループは2つ必要ありません。
>>> FList = ["Mary Smith", "Kevin Bacon"]
>>> JG = [[3928, "Mary Smith"], [2920, "Jacob Francis"], [7777, "Kevin Bacon"]]
>>> ultralist = []
>>> for row in JG:
if row[1] in FList:
ultralist.append(row)
>>> ultralist
[[3928, 'Mary Smith'], [7777, 'Kevin Bacon']]
この方法はより簡潔で、コードを理解しやすくします。まず、次の操作を実行しようとしていJG
ます。特定の基準に一致する要素を検索します。JG
したがって、最初に反復するのではなく、最初に反復する方がすでに明確FList
です。次に、明示的なループスルーFList
を実行して名前のいずれかが一致するかどうかを確認する代わりにrow[1]
、ショートカットを使用できますrow[1] in FList
。とにかく、これは内部でforループを実行しますが、コードの意図が何であるかは本当に明らかです。
set
より高速なのは、 forを使用することFList
です。
>>> FList = set(["Mary Smith", "Kevin Bacon"])
>>> JG = [[3928, "Mary Smith"], [2920, "Jacob Francis"], [7777, "Kevin Bacon"]]
>>> ultralist = []
>>> for row in JG:
if row[1] in FList:
ultralist.append(row)
>>> ultralist
[[3928, 'Mary Smith'], [7777, 'Kevin Bacon']]
ループコードは変更されないことに注意してください。違いは、in
セットの操作がリストの操作よりもはるかに高速であることです。すべての要素を反復処理する必要はありませんが、代わりに、いくつかの凝ったハッシュルックアップを実行します。
そしてさらに良いのは、リスト内包表記を使用することです。
>>> FList = set(["Mary Smith", "Kevin Bacon"])
>>> JG = [[3928, "Mary Smith"], [2920, "Jacob Francis"], [7777, "Kevin Bacon"]]
>>> ultralist = [row for row in JG if row[1] in FList]
>>> ultralist
[[3928, 'Mary Smith'], [7777, 'Kevin Bacon']]
このコードは単純により簡潔であるため、さらに理解しやすくなっています。