用另一个子列表替换子列表-python

时间:2018-07-27 11:32:53

标签: python list replace sublist

我有一个列表:

Online = [['Robot1', '23.9', 'None', '0'], ['Robot2', '25.9', 'None', '0']]

如果我收到不同的值,我想替换子列表:

NewSublist1 =  ['Robot1', '30.9', 'Sending', '440']

NewSublist2 =  ['Robot2', '50']

我想要:

Online = [['Robot1', '30.9', 'Sending', '440'], ['Robot2', '50']]

子列表元素的数量可以更改。唯一相同的是机器人ID。因此,我想进行搜索,看看“机器人ID”是否在“在线”列表中,并将子列表替换为新列表。

1 个答案:

答案 0 :(得分:0)

您可以创建一个字典,将新子列表中的robot ID映射到实际的新子列表,然后在该字典中查找现有的robot ID,并相应地替换。

>>> Online = [['Robot1', '23.9', 'None', '0'], ['Robot3', 'has no replacement'], ['Robot2', '25.9', 'None', '0']]
>>> NewSublists = [['Robot1', '30.9', 'Sending', '440'], ['Robot2', '50'], ['Robot4', 'new entry']]
>>> newsub_dict = {sub[0]: sub for sub in NewSublists}
>>> [newsub_dict.get(sub[0], sub) for sub in Online]
[['Robot1', '30.9', 'Sending', '440'],
 ['Robot3', 'has no replacement'],
 ['Robot2', '50']]

这将循环遍历列表中的每个元素,使其复杂度为O(n),n为Online列表中元素的数量。相反,如果您使Online也是将robot ID映射到子列表的字典,则可以将其降低到O(k),k是新子列表的数量。

如果您还想从NewSublistsOnline中添加元素(如果尚不存在),则应确定Online转换为{{1 }};那么您可以简单地dict字典并获得update。顺序很重要,请确保使用values或Python 3.7。

collections.OrderedDict