我需要将有价值的字典中的前导字符切片 - 但前提是该值的长度大于1.目前我正在使用字典理解这样做:
new_dict = {item[0]:item[1][1:] for item in old_dict if item.startswith('1')}
但我不知道如何修改它,以便长度为1的键保持不变。
密钥是霍夫曼代码的代码字,因此以“0”或“1”开头。
示例代码是:
code = {'a':'0', 'b':'10', 'c':'110', 'd':'111'}
上面的代码适用于'b','c','d'但是'a'失败(这是一个内容 - 它是一个单元测试)。
如何正确修改上述示例以通过测试?
答案 0 :(得分:1)
我不确定哪个变量在哪里,但你可以沿着这些方向做点什么。
new_dict = { item[0]:item[1][1] if len(item[1]) > 1 else item[0]:item[1] for item in old_dict if item.startswith('1') }
答案 1 :(得分:1)
理解的本质是它迭代地构建一个新对象,所以如果你希望原始对象old_dict
中的每个键都在new_dict
中有一个相应的键,你只需要处理每一把钥匙。
另外,你说“我需要将字符串中的前导字符切成字典”,但是你给出的代码会将值除去前导字符。我假设你的意思是价值观。我建议如下:
new_dict = {key:(value[:1] if len(value) > 1 else value) for key,value in old_dict.iteritems()}
除了使用序列赋值使迭代更清晰之外,我还使用了if表达式(相当于c语言中的三元运算符)来合并条件。
我还删除了原来的if
条款,因为我不理解你想要跳过以'1'
开头的值。
答案 2 :(得分:0)
如果我理解你的问题,你可以用这个来完成:
new_dict = {k:v[len(v)>1:] for k,v in old_dict.items()}
如果密钥只有1个字符, v[len(v)>1]
将返回密钥,如果是多个字符,它将删除主要字符
我不确定你要用if item.startswith('1')
完成什么是列表理解的限定符,但是如果你需要它,你可以重新添加它。可能需要将其设为v.startswith('1')
。