我有两个列表,其中一个列表包含名字和姓氏列表(作为一个列表项):
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>
任何人都可以告诉我为什么以及我必须做些什么来使这项工作?
答案 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]