首页 > 解决方案 > 如何使用 Python 删除字典中仅包含表情符号的元素

问题描述

当我有一个像这样的字典时:

dict = {'xyz': 'Sooo ein schönes Bild von dir ', 'xyz2': '✨✨✨', 'xyz3': 'toll, super schön'}

如何使用“表情符号”仅查找带有表情符号的元素(即此处键 xyz2 的值)并将其从字典中删除?

我使用 Python 的表情符号模块。https://pypi.org/project/emoji/

标签: pythondictionaryemoji

解决方案


首先考虑如何使用“官方”emoji包功能检测表情符号demojize。它可以将字符串中的表情符号解码为标记,因此我们只需要检测是否有任何非标记元素。每个标记都是一个以冒号开头和结尾的字符串,例如 :smile: 或 :heart:。因此,如果 demojized 字符串不是从标记(分号)开始,或者标记后跟非标记 - 那是非表情符号存在的标志。

def are_emojis(s):
    s = s.replace(":", "x")  #  colons from the original text might intefere with token markup
    s = emoji.demojize(s)
    if not s.startswith(':') or len(s) < 3:
        return False     # first symbol is not emoji
    s = s[1:-1] # drop the initial and the last colon
    s = s.replace("::", "")  # delete double colons
    return ":" not in s


for k in list(d):
    if are_emojis(d[k]):
        del d[k]

可能,更直观的解决方案是使用该包中未记录的正则表达式表情符号匹配器,或者,对于简单的情况,甚至是下面的表情符号列表

from emoji import UNICODE_EMOJI


def is_emoji(s):
    return s in UNICODE_EMOJI


for k in list(dict):
    if all(map(is_emoji, dict[k])):
        del dict[k]

遗憾的是,在多符号表情符号序列的情况下,当表情符号与修饰符或组合器(例如肤色或零宽度连接器)一起使用时,它会失败。一种解决方法是将组合器和修饰符添加到该表情符号列表中,但随后程序还将删除仅包含修饰符和组合器的字符串。更好地使用emoji包正则表达式。

如果您更喜欢构建没有某些元素的新字典,请参阅https://thispointer.com/python-filter-a-dictionary-by-conditions-on-keys-or-values/上的食谱


推荐阅读