从字节列表创建键对应双值的字典时遇到技术问题
解决字节列表转“一键两值”字典的问题
首先得说,你之前的代码思路偏了——zip(list[1::3], list[2::3]+list[0::3])这种写法会把所有数值和日期拼接成一个长列表,和名称列表zip的时候,每个名称只会对应到数值列表里的元素,日期部分根本没和对应的名称配对,自然达不到“一个键对应两个值”的效果。
正确的思路分析
看你的字节列表,明显是每3个元素为一组:[日期, 名称, 数值],我们要做的就是把每个分组里的名称作为键,日期和数值打包成元组(或列表)作为对应的值。
代码实现
先给你的列表起个合理的变量名(别用list,这是Python内置类型,容易冲突):
byte_list = [b'Expected in April 2018', b'Murder At Koh E Fiza', b'34', b'06 April 2018', b'Subedar Joginder Singh', b'0', b'06 April 2018', b'Blackmail', b'86', b'06 April 2018', b'Missing', b'0', b'13 April 2018', b'October', b'59', b'13 April 2018', b'Mercury', b'0', b'20 April 2018', b'Omerta', b'50']
方法一:列表推导式分组+字典推导
先把列表按每3个元素拆分,再直接构建字典:
# 按每3个元素拆分成分组 groups = [byte_list[i:i+3] for i in range(0, len(byte_list), 3)] # 构建字典:名称为键,(日期, 数值)为值(如果需要转成字符串就加.decode()) result_dict = {group[1].decode(): (group[0].decode(), group[2].decode()) for group in groups}
方法二:用zip迭代分组
利用zip(*[iter(byte_list)]*3)可以快速把列表按固定长度分组,遍历构建字典:
result_dict = {} # 每次迭代取出一组的日期、名称、数值 for date, name, value in zip(*[iter(byte_list)]*3): # 如果不需要转字符串,直接用字节串即可 result_dict[name.decode()] = (date.decode(), value.decode())
最终效果
运行后你会得到预期的字典:
print(result_dict) # 输出: { 'Murder At Koh E Fiza': ('Expected in April 2018', '34'), 'Subedar Joginder Singh': ('06 April 2018', '0'), 'Blackmail': ('06 April 2018', '86'), 'Missing': ('06 April 2018', '0'), 'October': ('13 April 2018', '59'), 'Mercury': ('13 April 2018', '0'), 'Omerta': ('20 April 2018', '50') }
内容的提问来源于stack exchange,提问作者user9201290
相关产品推荐
相关产品推荐

