根据另一个列表更新列表中的项目

Update items in a list based on another list

我有一个包含名称、位置和分数的列表,然后有一个新列表,我设法从游戏中获取数据 api,循环它并在之后附加它,它将清空newlist 和 rinse repeat(在我的示例中,我不会放置 api 循环代码,而是放置我得到的数据以使其简单)

list = [
        ['Charlie', '3', '2000'],
        ['Bill', '2', '2100'],
        ['Alan', '1', '2200']
        ]

newlist = [
        ['Charlie', '3', '2300'],
        ['Bill', '2', '2350'],
        ['Alan', '1', '2400']
        ]

#doesn't work as mentioned previously  
list.append(updatedlist)

print(list)

所以我只需要将新列表更新到主列表,如您所见,对于给定的名称-位置对,新列表中的分数会发生变化。

我希望原始列表反映更新后的分数。我该怎么做?

一个基本假设是,在您的用例中,lst(不要使用 list 来命名您的对象)肯定比 newlist 大得多,而且并非全部条目可能会更新(否则您可能已经完成 lst = newlist)。

这里的另一个假设是元组中的前两个元素形成 "key",最后一个元素形成每个条目的 "value"。我们将使用此设置来解决我们的问题。

强力解决方案将涉及嵌套循环和 运行 二次方时间。您可以散列数据并将其简化为线性运算,使用 OrderedDict 来维持顺序。

让字典为您处理更新。

from collections import OrderedDict

# initialise an ordered dictionary from your existing data
o = OrderedDict((v[:-1], v[-1]) for v in lst)
# initialise an ordered dictionary from your new data
o_new = OrderedDict((v[:-1], v[-1]) for v in newlist)
# update current entries with new/updated entries 
o.update(o_new)

lst_updated = [k + (v, ) for k, v in o.items()]

print(lst_updated)
[('Charlie', '3', '2300'), ('Bill', '2', '2350'), ('Alan', '1', '2400')]