使用列表列表作为查找表并更新新列表列表中的值

问题描述 投票:4回答:3

我有一个创建列表列表的应用程序。需要使用查找列表分配列表中的第二个元素,查找列表也包含列表列表。

我使用“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]
python list
3个回答
4
投票

你无法用all()做你想做的事,因为elem不是生成器表达式之外的局部变量。

而不是使用列表,使用字典来存储lookupList

lookupDict = dict(lookupList)

并查找匹配是一个简单的恒定时间(快速)查找:

for entry in newData:
    if entry[0] in lookupDict:
        entry[1] = lookupDict[entry[0]]

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]])

0
投票

我喜欢以下代码,因为它可以通过不同的方式进行调整和使用:

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)
© www.soinside.com 2019 - 2024. All rights reserved.