如何从字典的值中打印 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
#️⃣
>>>
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
#️⃣
>>>