-2

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

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 的第一个值上。

谁能告诉我为什么以及我必须做些什么来完成这项工作?

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

>>> 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以查看是否有任何名称匹配。无论如何,这在内部执行了一个 for 循环,但是很清楚代码的意图是什么。row[1]row[1] in FList

更快的是使用setfor 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 中没有“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]
于 2012-08-14T15:05:29.000 回答