根据字典替换列表中值的Pythonic方法

Posted

技术标签:

【中文标题】根据字典替换列表中值的Pythonic方法【英文标题】:Pythonic way to replace values in a list according to a dictionary 【发布时间】:2020-10-05 21:41:20 【问题描述】:

我需要根据 Python 字典中包含的值转换列表值。

我有一个如下列表:

lst = ["hello", "word", "bye", "my", "friend", "hello"]

还有一个使用集群过程获得的字典,所以键是标签,值是类别:

my_dict = 0: ["hello", "word"], 1: ["my", "friend"], 2: ["bye"]

我需要更快地将原始列表转换为:

new_lst = [0, 0, 2, 1, 1, 0]

考虑在实际情况下,列表长度接近 60k,因此我需要一种有效的方法来执行此操作。

【问题讨论】:

使用 pandas 可以吗? 不,它不在 Pandas 中,如果可能,我不想将列表加载到 Pandas 中 知道了!特别是对于大型列表,使用 pandas 可能会快得多。因此,如果您愿意,我可以将 pandas 解决方案作为一个小额外内容发布。 :) 是的,绝对!我不喜欢使用 pandas,因为我正在从事一个目前尚未在 Pandas 中开发的大型项目。无论如何,如果可以节省很多时间,我可以考虑切换到 Pandas :) 【参考方案1】:
lst = ["hello", "word", "bye", "my", "friend", "hello"]
my_dict = 0: ["hello", "word"], 1: ["my", "friend"], 2: ["bye"]

inverse_dict = b:a for a,c in my_dict.items() for b in c

new_lst = [inverse_dict.get(a) for a in lst]

【讨论】:

我接受这个答案,因为它明白了。只是为了分享,我添加了一个if 条件以检查令牌a 是否在inverse_dict 中:[inverse_dict[a] if a in inverse_dict.keys() else np.nan for a in lst] @AndreaM 您可以使用 .get 来避免 if 条件。查看我的编辑。【参考方案2】:

对于任何有兴趣在pandas这样做的人:

my_dict = 0: ["hello", "word"], 1: ["my", "friend"], 2: ["bye"]
# revert the dict
my_dict_rev = k2: k for k, v in my_dict.items() for k2 in v
# convert the list to a pandas Series
ser = pd.Series(["hello", "word", "bye", "my", "friend", "hello"])
# replace the values
rev_ser = ser.replace(my_dict_rev)

我知道答案不是要求pandas 解决方案,但特别是对于大型 列表,pandas 可能会快得多。也可能其他已经在使用pandas 的人会看到这个。

【讨论】:

【参考方案3】:

通过简单的列表理解也很容易做到这一点。无需使用 Pandas 。

lst = ["hello", "word", "bye", "my", "friend", "hello"]
my_dict = 0: ["hello", "word"], 1: ["my", "friend"], 2: ["bye"]

result = []
[result.append(k) for word in lst for k,v in my_dict.items() if word in v]

print(result)

输出:

[0, 0, 2, 1, 1, 0]

【讨论】:

这不是正确的列表理解。查看@warped 的答案以了解正确列表理解的实现。

以上是关于根据字典替换列表中值的Pythonic方法的主要内容,如果未能解决你的问题,请参考以下文章

从嵌套字典结构列表(具有两个级别)创建数据框的 Pythonic 方法是啥?

在列表中查找具有值的最小字典键的 Pythonic 方法?

如何根据字典中值的大小, 对字典中的项排序

字典对象的 Pythonic 用法(上篇)

浅谈python 字典对象的 Pythonic 用法

Pythonic循环字典的方法