文章目录
前言:
今天在做ip池创建的时候,总是无法从列表正常转字典,用了 zip和dict函数,各种尝试都宣告失败。因为url地址的前缀 http或https导致了字典健值重复问题(一键多值),故而结果就只是大量的ip数据从列表(或者从元组转也一样)转到字典格式以后,往往就只剩下两个元素项:字典的健分别为http和https,对应的值是最后一个数据(最后的转换或者赋值操作语句)
问题最后还是解决了,原因自己也找了出来。
归根结底,是自己经验不足导致的
如果你也遇到了类似的一键多值问题,认真看完这篇文章并加以思考,相信会有所收获的。
my_list = [('http', '1.2.3.4'), ('https', '4.5.6.7'), ('http', '7.8.9.4'), ('https', '1.1.0.0')]
my_dict = {}
for i in range(len(my_list)):
if my_list[i][0] in my_dict.keys():
print('1')
my_dict[my_list[i][0]].append(my_list[i][1])
else:
print('2')
my_dict[my_list[i][0]] = list()
my_dict[my_list[i][0]].append(my_list[i][1])
print('my_dict = ', my_dict)
正确的代码如上,测试的结果如下:
接下来是两次不同的错误版本:
错误的原因是下列版本会导致第一个字典元素的值被拆分成多个值
这是由list强转的特性决定的
my_list = [('http', '1.2.3.4'), ('https', '4.5.6.7'), ('http', '7.8.9.4'), ('https', '1.1.0.0')]
my_dict = {}
for i in range(len(my_list)):
if my_list[i][0] in my_dict.keys():
print('1')
my_dict[my_list[i][0]].append(my_list[i][1]) # 这是改进前的句子,与下边被注释的是一对
else:
print('2')
my_dict[my_list[i][0]] = list(my_list[i][1]) # 直接转可能会在第一个元素产生意外(不是自己想要的字典结果)
print('my_dict = ', my_dict)
出错版本(1)
my_list = [('http', '1.2.3.4'), ('https', '4.5.6.7'), ('http', '7.8.9.4'), ('https', '1.1.0.0')]
my_dict = {}
for i in range(len(my_list)):
if my_list[i][0] in my_dict.keys():
print('1')
my_dict[my_list[i][0]] = list(my_list[i][1]) # 如此改进还是存在同样的问题
else:
print('2')
my_dict[my_list[i][0]] = my_list[i][1] # 故决定存在一值多建时,再把值转为列表
print('my_dict = ', my_dict)
出错版本(2)
问题的解决总结如下:
字典一键多值需要依靠列表作为值的存储形式
而为了避免出错,往往建议先置空列表再使用append函数在相应元素处末尾添加新的值。
2019/11/10 02:15
dict.setdefault(key,[])
dict[key].append(values)
values = list[v1,v2,v3,…,vn]
18:50