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的第一个值上.
任何人都可以告诉我为什么以及我必须做些什么来使这项工作?
您的代码似乎工作得很好:
>>> 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
什么是快将使用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']]
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)
此代码更简洁,因此更容易理解.