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

问题描述 投票:0回答:1

刚接触Python,整天都在为这个问题绞尽脑汁。

我正在处理emojis的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))

上面的代码给了我一个由以下键值对组成的字典。

键值: emoji_list中的一个表情符号作为键。

值,是由1.代表该表情符号的unicode值(来自grouped_code_list)和2.包含表情符号CLDR短名和相关键值列表的第二个元组组成。 1.代表该表情符号的unicode值(来自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")

产量

>>> #️⃣

我尝试了很多不同的方法,主要是用不同的方法来转义而不是转义出反斜杠。

例如,如果我在.tolist()之前在源数据框中添加"\U",结果列表中会添加一个"\"来转义"\"。所以,我的grouped_code_list会是这样的。

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

我考虑过用CLDR的短名来打印,但使用unicode的重点是,我通常可以打印emojis',这将抛出这个错误:"SyntaxError: (unicode错误)'unicodeescape'编解码器无法解码0-19位置的字节:未知的Unicode字符名"

我更希望在必要的时候可以选择用多个unicode值来构建某些表情符号,而不是因为CLDR短名不被识别而扔掉几百个表情符号。

有谁有解决办法吗?我一定是在这些打印方式上遗漏了什么吗?

python python-3.x unicode emoji python-unicode
1个回答
2
投票

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是什么?对于?


0
投票

看起来这些值是一个用十六进制格式表示的32位数字的列表。理解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
#️⃣
>>>
© www.soinside.com 2019 - 2024. All rights reserved.