用于关联字典列表和列表列表的pythonian one-liner

adh*_*dhg 1 python dictionary list

给出一个项目列表[音乐家]和一个词典列表[instrumets]如何以pythonic方式将它们之间的关联

因此,为了简化我的真实场景,请考虑以下事项:

musicians  = [[700,"James","Hetfield", "jh@metallica.com","N/A"],
              [701,"Lars","Ulrich","lu@metallica.com","N/A"],
              [702,"Kirk","Hammett","kh@metallica.com","N/A"],
              [703,"Robert","Trujillo", "rt@metallica.com","N/A"]]

instruments= ({700:"guitar"},{701:"drums"})
Run Code Online (Sandbox Code Playgroud)

我的目标是用乐器中的乐器取代N/A音乐家.

下面的代码将成功(但直觉来自java/c ++)

for m in musicians:
    for i in instruments:
        if m[0] in i:
            m[4]=i[m[0]]
Run Code Online (Sandbox Code Playgroud)

并且正确的期望结果将是:

[[700, 'James', 'Hetfield', 'jh@metallica.com', 'guitar'], [701, 'Lars', 'Ulrich', 'lu@metallica.com', 'drums'], [702, 'Kirk', 'Hammett', 'kh@metallica.com', 'N/A'], [703, 'Robert', 'Trujillo', 'rt@metallica.com', 'N/A']]
Run Code Online (Sandbox Code Playgroud)

问:有没有经典的方法在python中做到这一点?

jpp*_*jpp 5

您可以使用collections.ChainMap组合仪器映射,然后使用列表推导:

from collections import ChainMap

cm = ChainMap(*instruments)
musicians = [[*x[:-1], cm.get(x[0], x[-1])] for x in musicians]

print(musicians)

# [[700, 'James', 'Hetfield', 'jh@metallica.com', 'guitar'],
#  [701, 'Lars', 'Ulrich', 'lu@metallica.com', 'drums'],
#  [702, 'Kirk', 'Hammett', 'kh@metallica.com', 'N/A'],
#  [703, 'Robert', 'Trujillo', 'rt@metallica.com', 'N/A']]
Run Code Online (Sandbox Code Playgroud)