如何从字典的值中打印 Unicode 表情符号

How to Print Unicode Emojis from Dictionary's Value

Python 的新手,一整天都在为这件事绞尽脑汁。

我正在使用表情符号的 unicode 值

按预期打印 unicode 值:

print("\U0001f600")

产量

>>> 

但是,我的用例有点复杂。我使用熊猫和数据框导入并格式化了大量表情符号。通过一系列可能比需要更复杂的 .tolist() 和压缩,我找到了我认为是我需要的字典格式。

带有小数据集的 .tolist() 示例:

emoji_list = ['#️⃣', '*️⃣', '0️⃣', '1️⃣']

grouped_code_list = [['00000023', '0000FE0F', '000020E3'], ['0000002A', '0000FE0F', '000020E3'], ['00000030', '0000FE0F', '000020E3'], ['00000031', '0000FE0F', '000020E3']]

short_name_list = ['keycap: #', 'keycap: *', 'keycap: 0', 'keycap: 1',]

keyword_list = ['keycap', 'keycap', 'keycap', 'keycap']

我将以上四个列表格式化到我的目标字典中:

# list into a list of lists
def extractDigits(list):
    keyword_list_list =[]
    for keyword in list:
        sub = keyword.split(', ')
        keyword_list_list.append(sub)

    return (keyword_list_list)

# implement extractDigits(list)
listed_keyword_list = extractDigits(keyword_list)

description_list = list(zip(short_name_list, listed_keyword_list))

emoji_code_list = list(zip(grouped_code_list, description_list))

emojiDictionary = dict(zip(emoji_list, emoji_code_list))

上面的代码给了我一个由以下 key/value 对组成的字典:

键:来自emoji_list的表情符号作为键

值: 元组 1. 表示该表情符号的 unicode value/s(来自 grouped_code_list)和 2. 包含表情符号的第二个元组CLDR 简称和相关关键字列表(来自 description_list)

打印字典如下所示:

print(emojiDictionary)
>>> {'#️⃣': (['00000023', '0000FE0F', '000020E3'], ('keycap: #', ['keycap'])), '*️⃣': (['0000002A', '0000FE0F', '000020E3'], ('keycap: *', ['keycap'])), '0️⃣': (['00000030', '0000FE0F', '000020E3'], ('keycap: 0', ['keycap'])), '1️⃣': (['00000031', '0000FE0F', '000020E3'], ('keycap: 1', ['keycap']))}

打印出来看起来更漂亮,看起来像这样:

for key in emojiDictionary:
    print("")
    print ("key: " + key)
    for values in emojiDictionary[key]:
        print ("value: " + str(values))


>>> key: #️⃣
>>> value: ['00000023', '0000FE0F', '000020E3']
>>> value: ('keycap: #', ['keycap'])

>>> key: *️⃣
>>> value: ['0000002A', '0000FE0F', '000020E3']
>>> value: ('keycap: *', ['keycap'])

>>> key: 0️⃣
>>> value: ['00000030', '0000FE0F', '000020E3']
>>> value: ('keycap: 0', ['keycap'])

>>> key: 1️⃣
>>> value: ['00000031', '0000FE0F', '000020E3']
>>> value: ('keycap: 1', ['keycap'])

问题

我的目标是能够打印字典中的 unicode 值,如果有多个则加入,并添加“\U”以打印表情符号本身。

这是执行几乎所有这些的代码:

print_first_emoji = str(r'\U' + r'\U'.join(emojiDictionary["#️⃣"][0]))

产量

>>> \U00000023\U0000FE0F\U000020E3

相比之下:

print("\U00000023\U0000FE0F\U000020E3")

产量

>>> #️⃣

我尝试了很多不同的方法,主要涉及 escaping/not 转义反斜杠的不同方法。

例如,如果我在 .tolist() 之前将“\U”添加到源数据帧,结果列表将添加一个“\”以将“\”转义出来。所以,我的 grouped_code_list 看起来像这样:

grouped_code_list = [['\U00000023', '\U0000FE0F', '\U000020E3'], ['\U0000002A', '\U0000FE0F', '\U000020E3'], ['\U00000030', '\U0000FE0F', '\U000020E3'], ['\U00000031', '\U0000FE0F', '\U000020E3']]

我考虑过使用 CLDR 短名称进行打印,但使用 unicode 的要点是我通常可以打印会引发此错误的表情符号: "SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-19: unknown Unicode character name"

我更喜欢在必要时选择使用多个 unicode 值构建某些表情符号,而不是因为无法识别 CLDR 短名称而丢弃数百个表情符号。

有人有解决方案吗?我是不是必须在这些打印方式中遗漏一些东西?

str(r'\U' + r'\U'.join(emojiDictionary["#️⃣"][0])) - 差不多了,但你不需要 str(它已经 一个字符串),你需要 ast.literal_eval :

from ast import literal_eval
print(literal_eval(r'"\U' + r'\U'.join(emojiDictionary["#️⃣"][0])+'"'))

然而,主要问题是为什么?您已经将表情符号作为密钥,为什么不直接打印出来呢?整个 emojiDictionary for 是什么?

看起来这些值是以十六进制格式表示的 32 位数字列表。 这可能会帮助您 understanding unicode

>>> a = ['00000023', '0000FE0F', '000020E3'] # list of values
>>> b = [int(i, 16) for i in a] # convert them to integers, base 16 since they were hex strings
>>> b
[35, 65039, 8419]
>>> c = [chr(i) for i in b] # get the characters for them
>>> c
['#', '️', '⃣']
>>> print(''.join(c)) # join those characters
#️⃣
>>> print(''.join(chr(int(i, 16)) for i in a)) #concise
#️⃣
>>>