如何在Python中使用字典的键替换列表中的项目

3

我有一个字典

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

列表

my_list = [2,3,1]

我想用my_dict中的键替换my_list中的项,类似于...
my_list = [b, c, a]

我该如何实现这个目标?


感谢所有的答案! - RandyMarsh
7个回答

4

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

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]],我该如何修改它?当然,字典会被添加 {"d":4}。 - RandyMarsh
你可能需要一个函数来首先运行以“检查”列表的列表(例如将其展平或至少建立一个条目到位置的引用)。更容易的方法是交换字典(如其他条目中所建议的)使其为{4:'d'},并迭代my_list内的每个列表。无论哪种方式,在这种情况下,可能都无法避免对my_listmy_dict进行一些初始处理。 - m_____z

3

字典是映射。你需要使用反向映射(使用值查找键),因此让我们反转字典。

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

然后我们将字典应用到每个元素:
my_list = [2,3,1]
result = [reversed_dict[elem] for elem in my_list]

1
你可以将字典的键值对反转,然后遍历列表以获取相应的键。
>>> 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']

0
你可以使用列表推导式来实现这个功能,需要做的是:根据你的列表对字典项进行排序,然后返回键值。
>>> 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']

0
rev = { v:k for k,v in my_dict.items()}
new_list = [rev[item] for item in my_list]

输出新列表:

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

0

这可能会起作用

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


注意:这种方法具有二次运行时复杂度,可以进行优化(请参见此处发布的其他解决方案)。 - m_____z

0

你可以使用函数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']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接