0

我需要将值的字典中的前导字符切掉 - 但前提是值的长度大于 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' 失败(这是内涵 - 这是一个单元测试)。

如何正确修改上述示例以通过测试?

4

3 回答 3

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') }
于 2013-10-14T14:16:03.593 回答
1

推导式的本质是它迭代地构建一个新对象,因此如果您希望原始对象中的每个键old_dict都有一个对应的键 in new_dict,您只需处理每个键。

另外,您说“我需要从字典中的键中切出前导字符”,但是您提供的代码将前导字符从值中切掉。我假设你的意思是价值观。我建议如下:

new_dict = {key:(value[:1] if len(value) > 1 else value) for key,value in old_dict.iteritems()}

除了使用序列赋值使迭代更清晰之外,我还使用了 if 表达式(相当于 c 语言中的三元运算符)来合并条件。

我还删除了您原来的if子句,因为我不明白您要跳过以 . 开头的值'1'

于 2013-10-14T14:19:47.917 回答
0

如果我正确理解您的问题,您可以通过以下方式完成:

new_dict = {k:v[len(v)>1:] for k,v in old_dict.items()}

v[len(v)>1]如果只有 1 个字符,则返回 key,如果超过 1 个字符,则删除前导字符

我不确定你想要完成的if item.startswith('1')是你的列表理解的限定符,但如果你需要它,你可以重新添加它。不过可能需要做到v.startswith('1')

于 2013-10-14T14:32:35.363 回答