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

时间:2012-08-14 14:54:43

标签: 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)

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

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

2 个答案:

答案 0 :(得分: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循环:

>>> 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使用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操作比列表快得多。您不必遍历每个元素,而是执行一些花哨的哈希查找。

更好的方法是使用list comprehension

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

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

答案 1 :(得分:0)

它只打印列表中第一项的原因是因为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]