如果字典的值是一个列表,有没有办法更新字典中键的值?
Is there a way to update the value of a key in a dictionary, if the value of the dictionary is a list?
我有四个特殊字符串列表,例如'™'。我将它们作为键 1 到 4 的值存储在字典中。
我正在尝试遍历每个字典列表中的所有项目,然后将每个值更新为其 utf-8 编码的等效值。
这是我目前拥有的:
li1 = ['€','‚','ƒ','„','…','†','ˆ','‰']
li2 = ['Š','‹','Œ','Ž']
li3 = ['‘','’','“','”','•','–','—','˜','™']
li4 = ['š','›','œ','ž','Ÿ']
uni_dic = {
'1':li1,
'2':li2,
'3':li3,
'4':li4
}
for key in uni_dic:
for val in uni_dic[key]:
uni_dic.update({key,val.encode('utf-8')})
这个returns一个'ValueError: dictionary update sequence element #0 has length 1; 2 is required'
取出最后三行写:
for key, values in uni_dic.items():
uni_dic[key] = [string.encode('utf-8') for string in values]
或一行:
uni_dic = {key: [string.encode('utf-8') for string in uni_dic[key]] for key in uni_dic}
uni_dic}
在这种情况下,您可以创建另一个列表,如下所示:
for key in uni_dic:
uni_dic[key] = [val.encode('utf-8') for val in uni_dic[key]]
如果你想做in-place:
for key in uni_dic:
for idx, val in enumerate(uni_dic[key]):
uni_dic[key][idx] = val.encode('utf-8')
您问题的one-line解决方案是:
uni_dic = {key:[val.encode('utf-8') for val in charList] for key, charList in uni_dic.items()}
要通过对您问题中的代码进行最少的修改来获得相同的结果,您可以这样做:
li1 = ['€','‚','ƒ','„','…','†','ˆ','‰']
li2 = ['Š','‹','Œ','Ž']
li3 = ['‘','’','“','”','•','–','—','˜','™']
li4 = ['š','›','œ','ž','Ÿ']
uni_dic = {
'1':li1,
'2':li2,
'3':li3,
'4':li4
}
for key in uni_dic:
charList = uni_dic[key]
for i, val in enumerate(charList):
charList[i] = val.encode('utf-8')
[print(charList) for charList in uni_dic.values()]
输出:
[b'\xe2\x82\xac', b'\xe2\x80\x9a', b'\xc6\x92', b'\xe2\x80\x9e', b'\xe2\x80\xa6', b'\xe2\x80\xa0', b'\xcb\x86', b'\xe2\x80\xb0']
[b'\xc5\xa0', b'\xe2\x80\xb9', b'\xc5\x92', b'\xc5\xbd']
[b'\xe2\x80\x98', b'\xe2\x80\x99', b'\xe2\x80\x9c', b'\xe2\x80\x9d', b'\xe2\x80\xa2', b'\xe2\x80\x93', b'\xe2\x80\x94', b'\xcb\x9c', b'\xe2\x84\xa2']
[b'\xc5\xa1', b'\xe2\x80\xba', b'\xc5\x93', b'\xc5\xbe', b'\xc5\xb8']
语法错误是您将更新指令指定为 {key,val.encode('utf-8')}
(实际上是 set
)而不是 {key: val.encode('utf-8')}
。但是,无论如何使用 update
来更新单个键有点愚蠢,并且它们循环遍历列表的方式,您只需依次用每个元素重复覆盖列表(最终以最后一项)。
相反,从编码值构建一个新列表,并将 整个列表 分配给 uni_dic[key]
:
for key in uni_dic:
encoded_vals = []
for val in uni_dic[key]:
encoded_vals.append(val.encode('utf-8'))
uni_dic[key] = encoded_vals
使用列表推导来构建 encoded_vals
让您更加简洁:
for key in uni_dic:
uni_dic[key] = [val.encode('utf-8') for val in uni_dic[key]]
使用 dict.items()
的字典理解使它更简单:
uni_dic = {k: [val.encode('utf-8') for val in v] for k, v in uni_dic.items()}
我有四个特殊字符串列表,例如'™'。我将它们作为键 1 到 4 的值存储在字典中。
我正在尝试遍历每个字典列表中的所有项目,然后将每个值更新为其 utf-8 编码的等效值。 这是我目前拥有的:
li1 = ['€','‚','ƒ','„','…','†','ˆ','‰']
li2 = ['Š','‹','Œ','Ž']
li3 = ['‘','’','“','”','•','–','—','˜','™']
li4 = ['š','›','œ','ž','Ÿ']
uni_dic = {
'1':li1,
'2':li2,
'3':li3,
'4':li4
}
for key in uni_dic:
for val in uni_dic[key]:
uni_dic.update({key,val.encode('utf-8')})
这个returns一个'ValueError: dictionary update sequence element #0 has length 1; 2 is required'
取出最后三行写:
for key, values in uni_dic.items():
uni_dic[key] = [string.encode('utf-8') for string in values]
或一行:
uni_dic = {key: [string.encode('utf-8') for string in uni_dic[key]] for key in uni_dic}
uni_dic}
在这种情况下,您可以创建另一个列表,如下所示:
for key in uni_dic:
uni_dic[key] = [val.encode('utf-8') for val in uni_dic[key]]
如果你想做in-place:
for key in uni_dic:
for idx, val in enumerate(uni_dic[key]):
uni_dic[key][idx] = val.encode('utf-8')
您问题的one-line解决方案是:
uni_dic = {key:[val.encode('utf-8') for val in charList] for key, charList in uni_dic.items()}
要通过对您问题中的代码进行最少的修改来获得相同的结果,您可以这样做:
li1 = ['€','‚','ƒ','„','…','†','ˆ','‰']
li2 = ['Š','‹','Œ','Ž']
li3 = ['‘','’','“','”','•','–','—','˜','™']
li4 = ['š','›','œ','ž','Ÿ']
uni_dic = {
'1':li1,
'2':li2,
'3':li3,
'4':li4
}
for key in uni_dic:
charList = uni_dic[key]
for i, val in enumerate(charList):
charList[i] = val.encode('utf-8')
[print(charList) for charList in uni_dic.values()]
输出:
[b'\xe2\x82\xac', b'\xe2\x80\x9a', b'\xc6\x92', b'\xe2\x80\x9e', b'\xe2\x80\xa6', b'\xe2\x80\xa0', b'\xcb\x86', b'\xe2\x80\xb0']
[b'\xc5\xa0', b'\xe2\x80\xb9', b'\xc5\x92', b'\xc5\xbd']
[b'\xe2\x80\x98', b'\xe2\x80\x99', b'\xe2\x80\x9c', b'\xe2\x80\x9d', b'\xe2\x80\xa2', b'\xe2\x80\x93', b'\xe2\x80\x94', b'\xcb\x9c', b'\xe2\x84\xa2']
[b'\xc5\xa1', b'\xe2\x80\xba', b'\xc5\x93', b'\xc5\xbe', b'\xc5\xb8']
语法错误是您将更新指令指定为 {key,val.encode('utf-8')}
(实际上是 set
)而不是 {key: val.encode('utf-8')}
。但是,无论如何使用 update
来更新单个键有点愚蠢,并且它们循环遍历列表的方式,您只需依次用每个元素重复覆盖列表(最终以最后一项)。
相反,从编码值构建一个新列表,并将 整个列表 分配给 uni_dic[key]
:
for key in uni_dic:
encoded_vals = []
for val in uni_dic[key]:
encoded_vals.append(val.encode('utf-8'))
uni_dic[key] = encoded_vals
使用列表推导来构建 encoded_vals
让您更加简洁:
for key in uni_dic:
uni_dic[key] = [val.encode('utf-8') for val in uni_dic[key]]
使用 dict.items()
的字典理解使它更简单:
uni_dic = {k: [val.encode('utf-8') for val in v] for k, v in uni_dic.items()}