根据其他列表更新列表中的项目

时间:2018-03-13 03:56:47

标签: python list insert-update

我有一个包含名称,位置和点数的列表,然后有一个新的列表,我设法从游戏api获取数据,循环并添加它之后它将清空新列表并冲洗重复(在我的例子我不会把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)

所以我需要的是将新列表更新到主列表,如您所见,对于给定的名称 - 位置对,分数在新列表中更改。

我希望原始列表能够反映更新的分数。我怎么能这样做?

1 个答案:

答案 0 :(得分:3)

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

这里的另一个假设是元组中的前两个元素形成"键",最后一个元素形成"值"每个条目。我们将此设置用于我们的解决方案。

蛮力解决方案将涉及嵌套循环并以二次方式运行。您可以使用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')]