列表中的列表如何被Python中新列表中的新列表覆盖?

时间:2014-11-18 17:29:06

标签: python list overwrite

如果有人知道如何表达问题以使其更清晰,请随时编辑它!

我有一个这样的清单:

a = [["Adolf", "10"], ["Hermann", "20"], ["Heinrich", "30"]]

我有一个'更新'列表,如下所示:

b = [["Rudolf", "40"], ["Adolf", "50"]]

我希望能够使用列表a添加新条目并覆盖列表b中的相同条目:

c = magic(a, b)

结果应如下:

>>> print(c)
[["Adolf", "50"], ["Hermann", "20"], ["Heinrich", "30"], ["Rudolf", "40"]]

是否存在像魔术一样的功能?如果没有,怎么写呢?


编辑:为了清楚,我知道字典方法。为了我的目的,我需要有重复的条目,所以字典是不合适的 - 这就是我询问列表的原因。在提到之前,这些特殊的重复条目将受到保护。例如,假设“Heinrich”是这些特殊类型的条目之一,可能有重复:

a = [['Adolf', '10'], ['Hermann', '20'], ['Heinrich', '30'], ['Heinrich', '15']]

现在,假设我有以下更新列表:

b = [['Rudolf', '40'], ['Adolf', '50']]

使用列表a更新列表b应该会产生以下列表:

>>> print(c)
[['Adolf', '50'], ['Hermann', '20'], ['Heinrich', '30'], ['Heinrich', '15'], ['Rudolf', '40']]

如您所见,有一些重复的条目。这就是不能直接使用字典的原因。

4 个答案:

答案 0 :(得分:1)

你可能应该使用字典。无论如何,你基本上都在模仿它的功能。如果您有字典a和字典b:

a = { "Adolf": "10", "Hermann": "20", "Heinrich": "30" }
b = { "Rudolf": "40", "Adolf": "50" }

然后你可以这样做:

a.update(b)

一行!非常简单。我想,那就像你将要进入内置的magic()一样接近。但是如果你只需要用列表做这个,而不用永远使用字典(因为我无法想象为什么它可以使用字典作为中间步骤,但是不将您的数据存储在一个中),您可以按如下方式进行:

def magic(original, update):
    for i in range(len(update)):
        found_match = False

        for j in range(len(original)):
            # if there's a matching 'key' in an index of the original list
            if update[i][0] == original[j][0]:
                found_match = True
                original[j][1] = update[i][1]

        # if there's no entry to override, place a new entry in
        if not found_match:
            original.append(update[i])

但是,除非你有一些超级怪异的用例,否则我无法想象为什么这比字典更适合收藏或性能。

答案 1 :(得分:1)

  1. a转换为词典
  2. 使用充满a字典作为参数调用b上的更新方法
  3. 获取a
  4. 更新版本中的项目列表

    以下是一个例子:

    adict = dict(a)
    adict.update(dict(b))
    [list(item) for item in adict.iteritems()]
    

答案 2 :(得分:1)

>>> a = [["Adolf", "10"], ["Hermann", "20"], ["Heinrich", "30"]]
>>> b = [["Rudolf", "40"], ["Adolf", "50"]
>>> c = [list(i) for i in (dict(a+b).items())] # if b is update list then use (a+b), if you write (b+a) it will treat a as update list.
>>> c
[['Hermann', '20'], ['Rudolf', '40'], ['Adolf', '50'], ['Heinrich', '30']]

答案 3 :(得分:1)

我建议你使用他们提到的词典。

我假设您已经列出了ab

列表
def magic(a, b):
    d = dict(a)   # convert a to a dictionary
    d.update(b)   # value updates
    result = [ list(i) for i in d.iteritems() ]
    return result

结果是您想要的格式