【问题标题】:How to replace items in list with a keys from dictionary in Python如何用Python中字典中的键替换列表中的项目
【发布时间】:2019-12-03 09:47:08
【问题描述】:

我有一本字典

my_dict = {"a":1, "b":2, "c":3}

并列出

my_list = [2,3,1]

我想用 my_dict 中的键替换 my_list 中的项目,例如...

my_list = [b, c, a]

我怎样才能做到这一点?

【问题讨论】:

  • 感谢所有答案!

标签: python python-3.x list dictionary


【解决方案1】:

您可以反转您的dict的键值对,然后迭代您的列表以获取相应的键。

>>> rev_dict = dict((v,k) for k,v in my_dict.items())
>>> rev_dict
{1: 'a', 2: 'b', 3: 'c'}
>>> [rev_dict[x] for x in my_list]
['b', 'c', 'a']

【讨论】:

    【解决方案2】:

    我确信可以制造一个列表推导式,但这可能是一种方法(它只对列表进行一次迭代,并允许您覆盖循环内的潜在边缘情况):

    for key, value in my_dict.items():
        if value not in my_list:
            # Does this case need special handling?
            continue
    
        index = my_list.index(value)
        my_list[index] = key
    

    这里有一些边缘情况需要考虑,例如如果不是所有项目都匹配会发生什么情况,如果字典和列表的长度不等怎么办等。根据您的用例,您希望确保相应地涵盖所有可能的边缘情况。

    应用于您的示例代码,它会产生以下输出:

    >>> my_dict = {"a":1, "b":2, "c":3}
    >>> my_list = [2,3,1]
    >>> my_dict
    {'a': 1, 'b': 2, 'c': 3}
    >>> my_list
    [2, 3, 1]
    >>> for key, value in my_dict.items():
    ...     if value not in my_list:
    ...         # Does this case need special handling?
    ...         continue
    ...     index = my_list.index(value)
    ...     my_list[index] = key
    >>> my_list
    ['b', 'c', 'a']
    

    【讨论】:

    • 效果很好。如果我的列表是例如 my_list = [[1,2],[3,4]],我该如何修改?当然 dict 附加 {"d":4}
    • 您可能需要一个首先运行的函数来“检查”列表列表(例如,将其展平或至少建立对位置条目的引用)。可能更容易交换字典(如其他一些条目中所建议的那样),使其成为{4: 'd'} 并遍历my_list 中的每个列表。无论哪种方式,在这种情况下,可能无法绕过 my_list 或 my_dict 的一些初始处理。
    【解决方案3】:

    字典是映射。您想使用反向映射(使用值来查找键),所以让我们反转 dict。

    my_dict = {"a":1, "b":2, "c":3}
    reversed_dict = {my_dict[k]:k for k in my_dict}
    

    然后我们只需将 dict 应用于每个元素:

    my_list = [2,3,1]
    result = [reversed_dict[elem] for elem in my_list]
    

    【讨论】:

      【解决方案4】:
      rev = { v:k for k,v in my_dict.items()}
      new_list = [rev[item] for item in my_list]
      

      输出new_list:

      ['b', 'c', 'a']
      

      【讨论】:

        【解决方案5】:

        这可能会起作用

        for key, val in my_dict.items():
            for i, v in enumerate(my_list):
                if v == val:
                    my_list[i] = key
        
        

        【讨论】:

        • 注意:这种方法具有二次运行时复杂性并且可以进行优化(请参阅此处发布的其他解决方案)。
        【解决方案6】:

        您可以使用列表推导来做到这一点,您需要做的是:根据您的列表对 dict.items 进行排序,然后返回键:

        >>> my_dict = {"a":1, "b":2, "c":3}
        >>> my_list = [2,3,1]
        >>> [key for key, value in sorted(my_dict.items(), key = lambda x:my_list.index(x[1]))]
        ['b', 'c', 'a']
        

        【讨论】:

          【解决方案7】:

          您可以使用函数itemgetter。首先,您需要交换字典中的键和值:

          from operator import itemgetter
          
          dct = {"a": 1, "b": 2, "c": 3}
          lst = [2, 3, 1]
          
          dct = {v: k for k, v in dct.items()}
          # {1: 'a', 2: 'b', 3: 'c'}
          
          print(list(itemgetter(*lst)(dct)))
          # ['b', 'c', 'a']
          

          【讨论】:

            猜你喜欢
            • 2021-10-14
            • 1970-01-01
            • 2014-03-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-11-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多