在理解中切割字符串

时间:2013-10-14 14:10:46

标签: python

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

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

3 个答案:

答案 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')