迭代两个列表,第一个列表仅通过第一个值

Cec*_*uez -2 python arrays list

我有两个列表,其中一个列表包含名字和姓氏(作为一个列表项):

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)
Run Code Online (Sandbox Code Playgroud)

现在我希望在JG中得到一个行列表,其中row [1]的值是==到FList中的一个列表项,但这只发生在FList的第一个值上.

任何人都可以告诉我为什么以及我必须做些什么来使这项工作?

Cla*_*diu 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']]
Run Code Online (Sandbox Code Playgroud)

出了什么问题?


虽然我在这里,但这是一个更好的方法.您不需要两个for循环:

>>> 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']]
Run Code Online (Sandbox Code Playgroud)

此方法更简洁,使代码更容易理解.首先,您正在尝试对其进行操作JG:在其中查找符合特定条件的元素.所以首先迭代JG而不是迭代已经更清楚了FList.然后,您可以使用快捷方式,而不是通过显式循环FList来查看是否有任何名称匹配.无论如何,这在内部执行for循环,但是很清楚代码的意图是什么.row[1]row[1] in FList

什么是快将使用setFList:

>>> 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']]
Run Code Online (Sandbox Code Playgroud)

请注意,循环代码不会更改.不同的是,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']]
Run Code Online (Sandbox Code Playgroud)

此代码更简洁,因此更容易理解.