2013-10-14 78 views
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」,但關於「一個」失敗(這是內涵 - 這是一個單元測試)。

如何正確修改上述示例以通過測試?

+0

代碼中有一個錯字FYI,應該用逗號分隔 – mlnyc

+0

@mlnyc應該更改 –

+0

您是否在尋找更好的方法? – aIKid

回答

1

一個理解的本質在於它建立一個新的對象反覆,因此如果您想在原來的對象old_dict每個鍵有new_dict相應的按鍵,你只需要處理每一個關鍵。

另外,你說「我需要從字典中刪除主鍵字符」,但是你賦予的代碼將主要字符從值中刪除。我假定你的意思是價值。我建議如下:

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

除了使用順序分配,使迭代更清楚一點,我已經使用了,如果表達式(相當於三元運營商在類似C語言)納入條件。

我也放棄了原來的if子句,因爲我不理解你想跳過從'1'開始的值。

+0

對不起,我的意思是價值 - 打字時沒有想到。 –

+0

@TomKealy另外,您是否想忽略以'1'開頭的值? – Marcin

+0

我將符號分組爲基於它們的代碼字是以1還是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') } 
0

如果我正確理解你的問題,你可以用這個完成它:

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

v[len(v)>1]將返回鍵,如果它僅僅是1個字符,如果它超過了它所能脫光主角一個字符

我不確定你想用if item.startswith('1')完成的是你的列表理解的限定詞,但如果你需要它,你可以重新加上它。但可能需要將它設爲v.startswith('1')