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対応するキーを に持たせたい場合は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文字のみの場合はキーを返し、複数の文字の場合は先頭の文字を取り除きます

あなたが達成しようとしているif item.startswith('1')のがリスト内包表記の修飾子であるかどうかはわかりませんが、必要な場合は元に戻すことができます。作る必要があるかもしれv.startswith('1')ませんが。

于 2013-10-14T14:32:35.363 に答える