根据另一个列表更新列表中的项目
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')]
我有一个包含名称、位置和分数的列表,然后有一个新列表,我设法从游戏中获取数据 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')]