2016-03-02 2 views
1

у меня есть словарь с ключами/значениями, такими как:Удалить пространство из словаря ключей

{'C 14': ['15263808', '478'], 'W 1': ['13122205']} 

Как удалить пустое пространство из всех ключей, и вместо этого они будут:

{'C14': ['15263808', '478'], 'W1': ['13122205']} 
+0

Вы хотите отредактировать существующий словарь или создать новый словарь? Нужно ли что-то делать с конфликтующими ключами? –

+0

Все ключи уникальны, в идеале пробелы будут удалены из существующих ключей словаря. – GreyTek

ответ

8

Вы можете обрабатывать все ключи в понимании словаря; вы можете использовать str.translate() для удаления пробелов; версия Python 2 для этого есть:

{k.translate(None, ' '): v for k, v in dictionary.iteritems()} 

и версия Python 3:

{k.translate({32: None}): v for k, v in dictionary.items()} 

Вы также можете использовать str.replace() удалить пробелы:

{k.replace(' ', ''): v for k, v in dictionary.items()} 

Но это может быть медленнее для более длинных клавиш; см. Python str.translate VS str.replace

Обратите внимание, что они производят словарь .

Demo на Python 2:

>>> d = {'C 14': ['15263808', '478'], 'W 1': ['13122205']} 
>>> {k.translate(None, ' '): v for k, v in d.iteritems()} 
{'W1': ['13122205'], 'C14': ['15263808', '478']} 

И 2,6 совместимая версия (с использованием Alternative to dict comprehension prior to Python 2.7):

dict((k.translate(None, ' '), v) for k, v in dictionary.iteritems()) 
+0

Как насчет 'iteritems()' для версии Python 2? –

+0

@pp_: yup, хорошая идея .. –

+0

Это на Python 2.6.6, поэтому понимание словаря не работает – GreyTek

4

Вы также можете просто использовать str.replace:

In [4]: d = {'C 14': ['15263808', '478'], 'W 1': ['13122205']} 

In [5]: d = {k.replace(" ",""): v for k,v in d.items()} 

In [6]: d 
Out[6]: {'C14': ['15263808', '478'], 'W1': ['13122205']} 

Для python2. 6:

d = dict((k.replace(" ",""),v) for k,v in d.items()) 
+0

Это на Python 2.6.6 поэтому понимание словаря не работает – GreyTek

+0

@GreyTek просто заменит его на gen exp и dict dict –

1

Без Dict понимания:

>>> d = {'C 14': ['15263808', '478'], 'W 1': ['13122205']} 
>>> dict(((k.replace(' ',''),v) for k,v in d.items())) 
{'W1': ['13122205'], 'C14': ['15263808', '478']} 
+0

Снимите квадратные скобки; нет смысла в создании списка сначала, где будет выполняться выражение генератора. –

+0

Вы правы. Изменен генератор. – Vader

1

Вот решение без dict понимания, что редактирует словарь на месте, и предполагает, что никакие две старые ключи не будут отображаться в том же новом ключе.

d = {'C 14': ['15263808', '478'], 'W 1': ['13122205']} 

for key in d.keys(): 
    if ' ' in key: 
     d[key.translate(None, ' ')] = d[key] 
     del d[key] 

print d # {'W1': ['13122205'], 'C14': ['15263808', '478']} 

После некоторого времени это примерно на 25% быстрее, чем создание нового словаря.

Цикл выполняет итерацию более d.keys(), а не d, чтобы избежать повторных ключей и избежать проблемы с «итерацией по изменяющемуся объекту».

+0

Перевод должен быть быстрее; возможно, мне нужно снова использовать одиночные замены. –

+0

@StevenRumbalski Я исправил проблему с ключом удаления, автор использует Python 2.6, поэтому нет необходимости рассматривать Python 3.X. –

+0

См. Http://stackoverflow.com/questions/31143290/python-str-translate-vs-str-replace –

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