Python 迭代两个列表,第一个列表只遍历第一个值

Python 迭代两个列表,第一个列表只遍历第一个值,python,arrays,list,Python,Arrays,List,我有两个列表,其中一个由名字和姓氏组成(作为一个列表项): FLIST=[“玛丽·史密斯”、“凯文·培根”]等等 然后我有另一个列表 JG=[[3928,“玛丽·史密斯”],[2920,“雅各布·弗朗西斯”]等等 我正在使用以下输出: ultralist = [] for item in FList: for row in JG: if row[1] == item: ultralist.append(row) 现在我希望得到JG中的行列表,其

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

FLIST=[“玛丽·史密斯”、“凯文·培根”]
等等

然后我有另一个列表

JG=[[3928,“玛丽·史密斯”],[2920,“雅各布·弗朗西斯”]
等等

我正在使用以下输出:

ultralist = []

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

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


有人能告诉我为什么以及我必须做什么才能使这项工作正常吗?

您的代码似乎工作正常:

>>> 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循环:

>>> 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中的捷径
行[1],而不是通过
FList
执行显式循环以查看是否有任何名称与
行[1]
匹配。无论如何,这在内部执行for循环,但代码的意图是什么,这一点非常清楚

更快的方法是为
FList
使用
set

>>> 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']]
请注意,循环代码不会更改。不同的是
中对集合的
操作要比列表快得多。您不必遍历每个元素,而是进行一些奇特的哈希查找

更好的方法是使用:


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

它只打印列表中的第一项的原因是因为FLIST中没有“Jacob Francis”

作为旁注,请确保FLIST的大小写保持不变

下面是一个可能的实现,使用单个列表理解

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

ultralist = [x for x in JG if x[1] in FLIST]

上面代码的预期结果是什么?“现在我希望得到JG中的行列表,其中第[1]行的值==到FList中的一个列表项”所以基本上,如果一个值在FList中,并且它也在JG的第[1]行中,那么超列表应该包含该行JG。@AndrewAlexander,我认为Mikael的观点是,您当前的输入将显示出完全相同的行为,因为唯一与JG中的值匹配的项是FList的第一个值。我已经测试了它的工作原理。“超级列表”包含每个JG元素,其中“名称”部分也存在于FList列表中。是什么使这些方法更好?更快?是的,让我更新我的问题,让它更明确。谢谢你的邀请
FLIST = ["Mary Smith", "Kevin Bacon"]
JG = [[3928, "Mary Smith"], [2920, "Jacob Francis"]]

ultralist = [x for x in JG if x[1] in FLIST]