刚接触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短名不被识别而扔掉几百个表情符号。
有谁有解决办法吗?我一定是在这些打印方式上遗漏了什么吗?
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是什么?对于?
看起来这些值是一个用十六进制格式表示的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
#️⃣
>>>