2013-10-14 4 views
0

Мне нужно нарезать ведущий символ с оцененного словаря - но только если длина значения больше 1. В настоящее время я делаю это со пониманием словаря:Нарезка строк в понимании

new_dict = {item[0]:item[1][1:] for item in old_dict if item.startswith('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()} 

Помимо использования задания последовательности, чтобы сделать итерация немного яснее, я использовал, если выражение (эквивалент тройной оператор в С-подобных языках), чтобы включить условие.

Я также отказался от вашего оригинального предложения if, потому что я не понимаю, что вы хотите пропустить значения, начиная с '1'.

+0

Извините, я имел в виду значения - набрав, не задумываясь. –

+0

@TomKealy Также вы хотите опустить значения, начинающиеся с '1''? – Marcin

+0

Я сортирую символы в группы, основываясь на том, начинается ли их кодовое слово с 1 или нуля.Затем мне нужно сделать это снова для списков и т. Д. Я думаю, что это совсем другой вопрос. –

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] возвращает ключ, если это только один символ, и он будет сдирать ведущий характер, если это больше, чем один знак

Я не уверен, что вы пытаетесь выполнить с помощью if item.startswith('1'), является квалификатором для вашего понимания списка, но если вам это нужно, вы можете добавить его обратно. Может понадобиться сделать это v.startswith('1').

Смежные вопросы