【问题标题】:How do I re-map python dict keys如何重新映射 python dict 键
【发布时间】:2010-10-13 06:01:56
【问题描述】:

我正在开发一个程序,该程序(除其他外)读取 CSV 文件(它以 [{col1:data1a,col2:data2a},{col1:data1b,col2:data2b}] 的形式存储为字典数组)。对于每一行,作为其他处理的一部分,我需要将这些键重新映射到用户输入的值,这些值在另一个 dict 中提供,因此它们可以用作 API 调用中的参数。映射数组的格式为:{badname1:goodname1, badname2:goodname2,...}

所以我想从:

{badname1:data1, badname2:data2,...}` to `{goodname1:data1, goodname2:data2,...}

我想使用类似zip() 的东西(尽管zip() 产生{badname1:badname1,...})。

似乎应该有一个明显的解决方案在暗示我。

如果数据在a,映射在b

dict(zip(b,a.itervalues()))

我已经接近了,但它只适用于已知字段的顺序与我认为相同的情况。

【问题讨论】:

    标签: python dictionary iterator


    【解决方案1】:
    name_map = {'oldcol1': 'newcol1', 'oldcol2': 'newcol2', 'oldcol3': 'newcol3'...}
    
    for row in rows:
        # Each row is a dict of the form: {'oldcol1': '...', 'oldcol2': '...'}
        row = dict((name_map[name], val) for name, val in row.iteritems())
        ...
    

    或者在 Python2.7+ 中使用Dict Comprehensions:

    for row in rows:
        row = {name_map[name]: val for name, val in row.items()}
    

    【讨论】:

      【解决方案2】:
      rows = [{"col1":"data1a","col2":"data2a"},{"col1":"data1b","col2":"data2b"}]
      name_map = {"col1":"newcol1","col2":"newcol2"}
      
      new_rows = [dict(zip(map(lambda x: name_map[x], r.keys()), r.values())) for r in rows]
      

      这就是你所追求的吗?

      【讨论】:

        【解决方案3】:

        如果您使用的是 Python 2.7 或 Python 3.x,则可以使用 dictionary comprehension。这等效于 elo80ka 的答案(使用了列表推导式),但生成的代码可读性更高。

        name_map = {'oldcol1': 'newcol1', 'oldcol2': 'newcol2', 'oldcol3': 'newcol3'...}
        
        for row in rows:
            # Each row is a dict of the form: {'oldcol1': '...', 'oldcol2': '...'}
            row = {name_map[name]: val for name, val in row.iteritems()}
            ...
        

        【讨论】:

          【解决方案4】:

          此功能可让您仅重新映射需要更改的键。

          def key_remapper(dictionary: dict):
              return {remap_dictionary.get(k, v): v for k, v in dictionary.items()}
          

          【讨论】:

            【解决方案5】:

            Python 3.7

            d = {'badname1': 'data1', 'badname2': 'data2'}
            m = {'badname1': 'goodname1', 'badname2': 'goodname2'}
            
            { m[k]:d[k] for k in d }
            

            输出

            {'goodname1': 'data1', 'goodname2': 'data2'}
            

            【讨论】:

            • 完全没有必要使用 f 弦。 { m[k]:d[k] for k in d } 也可以。
            • 非常正确。谢谢!
            【解决方案6】:

            基于此examples

            edited_dict = {'oldname1': 'data1', 'oldname2': 'data2', 'goodname3': 'data3'}
            remaped_key = {'oldname1': 'key_1', 'oldname2': 'key_2'}
            
            { remaped_key[key]:edited_dict[key] for key in edited_dict if key in remaped_key }
            # output
            {'key_1': 'data1', 'key_2': 'data2'}
            
            # same result:
            dict((remaped_key[key], edited_dict[key]) for key, value in edited_dict.items() if key in remaped_key)
            # output
            {'key_1': 'data1', 'key_2': 'data2'}
            

            或者重新映射只想要的键:

            edited_dict = {'oldname1': 'data1', 'oldname2': 'data2', 'goodname3': 'data3'}
            remaped_key = {'oldname1': 'key_1', 'oldname2': 'key_2'}
            
            dict((remaped_key[key], edited_dict[key]) if key in remaped_key else (key, value) for key, value in edited_dict.items())
            # output
            {'key_1': 'data1', 'key_2': 'data2', 'goodname3': 'data3'}
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-09-04
              • 2019-04-15
              • 2010-10-05
              • 1970-01-01
              • 1970-01-01
              • 2013-02-23
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多