Python 将列表列表用作查找表并更新新列表中的值
我有一个创建列表列表的应用程序。列表中的第二个元素需要使用lookup list进行分配,lookup list也由列表列表组成 我使用了“all”方法来匹配列表中的值。如果查找列表中存在该列表值,则应更新新列表中的第二个位置元素。但事实并非如此。==比较值为所有元素生成错误匹配,即使它们都存在于两个列表中 我还尝试了索引查找命令的各种组合,但它们无法解压缩每个列表的值 我的代码如下。目标是用lookupList中的数字替换newData中的“xxx”值Python 将列表列表用作查找表并更新新列表中的值,python,list,Python,List,我有一个创建列表列表的应用程序。列表中的第二个元素需要使用lookup list进行分配,lookup list也由列表列表组成 我使用了“all”方法来匹配列表中的值。如果查找列表中存在该列表值,则应更新新列表中的第二个位置元素。但事实并非如此。==比较值为所有元素生成错误匹配,即使它们都存在于两个列表中 我还尝试了索引查找命令的各种组合,但它们无法解压缩每个列表的值 我的代码如下。目标是用lookupList中的数字替换newData中的“xxx”值 lookupList= [['Garry
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)
查找匹配项是一种简单的固定时间(快速)查找:
您应该改用字典,如下所示:
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)
为什么不直接使用字典呢?@MartijnPieters我在考虑这个问题,但鉴于我的应用程序正在生成一个列表列表,所以我认为这可能是最好的选择。另外,生成的字符串可能非常冗长,我不确定这会对字典产生什么影响。我还将在每个列表中使用几百个列表。字典是处理这个问题最有效的方法吗?当然,毫无疑问。不会有任何新的字符串对象;您将从列表中创建的词典引用了相同的字符串对象。@MartijnPieters好的,谢谢,我想我使用词典的犹豫源于我自己对词典的想象。如果字典中使用的键的字符串长度没有限制,那么这一定是最好的解决方案。
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)