基于另一个列表更新列表中的项目

3

我有一个包含名称、职位和分数的列表,然后有一个新列表,我设法从游戏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)

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

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


我有点困惑。您是否想根据新结果更新玩家记录?如果是这样,您可以尝试使用不同的数据结构,例如pandas.DataFrame。 - Zhiya
元组是不可变的。使用其他东西,或者完全替换它。 - Ignacio Vazquez-Abrams
你的预期输出是什么? - Pyd
这两个列表的元素顺序是否与您在问题中提到的顺序相同? - Sohaib Farooqi
1个回答

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

我明白了,如果我在一个大列表的循环中放置它,会有性能问题吗?还是需要多线程? - user7716943
就复杂度而言,这是一个非常高效的解决方案——它的复杂度为O(n),线性的。它应该可以处理相当大的列表而不会出现任何问题。在实现基本算法之前不要考虑多线程。 - cs95
@user7716943 这个问题的R代码是什么? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接