我有一个创建列表列表的应用程序。需要使用查找列表分配列表中的第二个元素,查找列表也包含列表列表。
我使用“all”方法来匹配列表中的值。如果列表值存在于查找列表中,则它应更新新列表中的第二个位置元素。然而,这种情况并非如此。 ==比较产生所有元素的假匹配,即使它们都存在于两个列表中。
我还尝试了索引查找命令的各种组合,但它们无法解压缩每个列表的值。
我的代码如下。目标是用newList中的数字替换newData中的“xxx”值。
lookupList= [['Garry','34'],['Simon', '24'] ,['Louise','13'] ]
newData = [['Louise','xxx'],['Garry', 'xxx'] ,['Simon','xxx'] ]
#Matching values
for i in newData:
if (all(i[0] == elem[0] for elem in lookupList)):
i[1] = elem[1]
你无法用all()
做你想做的事,因为elem
不是生成器表达式之外的局部变量。
而不是使用列表,使用字典来存储lookupList
:
lookupDict = dict(lookupList)
并查找匹配是一个简单的恒定时间(快速)查找:
for entry in newData:
if entry[0] in lookupDict:
entry[1] = lookupDict[entry[0]]
你应该使用词典,如下所示:
lookupList = newData = {}
old_lookupList = [['Garry','34'],['Simon', '24'] ,['Louise','13'] ]
old_newData = [['Louise','xxx'],['Garry', 'xxx'] ,['Simon','xxx'] ]
#convert into dictionary
for e in old_newData: newData[e[0]] = e[1]
for e in old_lookupList: lookupList[e[0]] = e[1]
#Matching values
for key in lookupList:
if key in newData.keys():
newData[key]=lookupList[key]
#convert into list
output_list = []
for x in newData:
output_list.append([x, newData[x]])
我喜欢以下代码,因为它可以通过不同的方式进行调整和使用:
lookupList= [ ['Garry', '34'],['Simon', '24'] ,['Louise', '13'] ]
newData = [ ['Louise', 'xxx'],['Garry', 'xxx'], ['Peter', 'xxx'] ,['Simon', 'xxx'] ]
#Matching values
for R in newData:
for i in range(0, len(lookupList) + 1):
try:
if lookupList[i][0] == R[0]:
R[1] = lookupList[i][1]
break
except:
print('Lookup fail on record:', R)
print(newData)