如果有人知道如何表达问题以使其更清晰,请随时编辑它!
我有一个这样的清单:
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"]]
是否存在像魔术一样的功能?如果没有,怎么写呢?
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']]
如您所见,有一些重复的条目。这就是不能直接使用字典的原因。
答案 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)
a
转换为词典a
字典作为参数调用b
上的更新方法a
以下是一个例子:
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)
我建议你使用他们提到的词典。
我假设您已经列出了a
和b
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
结果是您想要的格式