【问题标题】:"merging" dictionaries using lambda and map使用 lambda 和 map“合并”字典
【发布时间】:2017-01-19 19:38:01
【问题描述】:

我在 python 中有以下两个字典,我需要对其进行转换以获取第三个字典

    matrikelnummer_zu_note = { 35135135: 5, 60103513: 3, 10981179: 2, 18637724 : 4 }
    note_zahl_zu_string = { 1: "summa cum laude", 2: "magna cum laude", 3: "cum laude", 4: "rite", 5: "non probatum" }

    {60103513: 'cum laude', 10981179: 'magna cum laude', 18637724: 'rite', 35135135: 'non probatum'}

所以我需要获取第一个字典的值并将它们替换为与第二个字典中相应键链接的值。

我可以通过这样一个简单的循环来解决这个问题:

def transform_dict(d1, d2): 
    for x in d1.keys():
        d1[x]=d2[d1[x]]
    return d1

但是我们的教授希望我们使用map() 函数和lambda-表达式来解决问题。

现在我开始尝试以这种方式围绕 lambda 和 map 函数“构建”我的解决方案:

def transform_dict(d1, d2):
    liste = list(d1.values())
    liste.sort()
    list(map(lambda elem_from_list,dictionary: dictionary[elem_from_list],liste,d2 ))

但我在最后一行说 TypeError: 'int' object is not subscriptable 时出现错误

我会真的感谢任何帮助解决这个问题。

提前非常感谢

【问题讨论】:

    标签: python python-3.x dictionary lambda


    【解决方案1】:

    您可以映射字典中的键值对项,然后对于每个值,将其用作键以从另一个字典中获取值:

    dict(map(lambda item: 
      (item[0], note_zahl_zu_string.get(item[1], item[1])), 
      matrikelnummer_zu_note.items()))
    
    #{10981179: 'magna cum laude',
    # 18637724: 'rite',
    # 35135135: 'non probatum',
    # 60103513: 'cum laude'}
    

    【讨论】:

    • @2ps 感谢您的编辑。但这会在 python 3 中引发错误。您不能再在 python 3 中解压 lambda 中的元组。见here
    【解决方案2】:

    当您对字典进行迭代(即映射)时,它会映射到键上。这解释了您的错误,因为您的 lambda 有两个参数,第二个参数从 note_zahl_zu_string 接收密钥。

    所以,这样的事情就足够了:

    >>> d1 = matrikelnummer_zu_note
    >>> d2 = note_zahl_zu_string
    >>> dict(map(lambda k1: (k1, d2[d1[k1]]), d1))
    {60103513: 'cum laude', 10981179: 'magna cum laude', 18637724: 'rite', 35135135: 'non probatum'}
    

    【讨论】:

    • 也有效,但它不是映射键值对而不是键吗?
    • @thedood 号试试for e in some_dict: print(e)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2015-10-07
    • 2017-08-03
    • 2014-09-23
    • 1970-01-01
    相关资源
    最近更新 更多