-2

私には2つのリストがあり、そのうちの1つは(1つのリスト項目としての)名前と名前のリストで構成されています。

FLIST = ["Mary Smith", "Kevin Bacon"]など。

それから私は持っている別のリストを持っています

JG = [[3928, "Mary Smith"], [2920, "Jacob Francis"]]、 など。

私は次の出力を使用しています:

ultralist = []

for item in FList:
    for row in JG:
        if row[1] == item:
            ultralist.append(row)

ここで、JGの行のリストを取得することを期待します。ここで、row [1]の値はFListのリスト項目の1つに対して==ですが、これはFListの最初の値に対してのみ発生します。

誰かが私にこの仕事をするためになぜそして私がしなければならないことを教えてもらえますか?

4

2 に答える 2

5

あなたのコードはうまく機能しているようです:

>>> 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']]

このコードは単純により簡潔であるため、さらに理解しやすくなっています。

于 2012-08-14T15:00:32.627 に答える
0

リストの最初の項目のみを印刷する理由は、FLISTに「JacobFrancis」がないためです。

補足として、FLISTの大文字と小文字が一定に保たれていることを確認してください。

これは、単一のリスト内包表記を使用した可能な実装です。

FLIST = ["Mary Smith", "Kevin Bacon"]
JG = [[3928, "Mary Smith"], [2920, "Jacob Francis"]]

ultralist = [x for x in JG if x[1] in FLIST]
于 2012-08-14T15:05:29.000 に答える