Перебор словаря в python и удаление пробелов - PullRequest
5 голосов
/ 18 января 2012

Я работаю с Scrap-фреймворком для веб-поиска и я немного новичок, когда дело доходит до Python.Поэтому мне интересно, как мне перебрать все очищенные элементы, которые кажутся в словаре, и убрать пробелы из каждого.

Вот код, с которым я играл в моем конвейере элементов.:

for info in item:
   info[info].lstrip()

Но этот код не работает, потому что я не могу выбирать элементы по отдельности.Поэтому я попытался сделать это:

for key, value item.items():
   value[1].lstrip()

Этот второй метод работает до некоторой степени, но проблема в том, что я понятия не имею, как тогда зациклить все значения.

Iзнаю, что это, вероятно, такое простое решение, но я не могу найти его.Любая помощь будет принята с благодарностью.:)

Ответы [ 7 ]

17 голосов
/ 18 января 2012

В словаре (доступно в Python> = 2.7):

clean_d = { k:v.strip() for k, v in d.iteritems()}

Python 3.X:

clean_d = { k:v.strip() for k, v in d.items()}
2 голосов
/ 18 января 2012

Не прямой ответ на вопрос, но я бы посоветовал вам взглянуть на Загрузчики элементов и процессоры ввода / вывода.Здесь вы можете позаботиться о многих ваших проблемах.

Пример, который удаляет каждую запись:

class ItemLoader(ItemLoader):

    default_output_processor = MapCompose(unicode.strip)
2 голосов
/ 18 января 2012

Следует отметить, что lstrip() возвращает копию строки, а не изменяет объект. Чтобы на самом деле обновить свой словарь, вам нужно присвоить разделенное значение обратно элементу.

Например:

for k, v in your_dict.iteritems():
    your_dict[k] = v.lstrip()

Обратите внимание на использование .iteritems(), которое возвращает итератор вместо списка пар ключ-значение. Это делает его несколько более эффективным.

Я должен добавить, что в Python3, .item() был изменен, чтобы возвращать «представления» , и поэтому .iteritems() не потребуется.

2 голосов
/ 18 января 2012

Попробуйте

for k,v in item.items():
   item[k] = v.replace(' ', '')

или всесторонне, как предлагает monkut:

newDic = {k,v.replace(' ','') for k,v in item.items()}
1 голос
/ 18 июня 2018

Предполагая, что вы хотите удалить значения yourDict, создав новый dict с именем newDict:

newDict = dict(zip(yourDict.keys(), [v.strip() if isinstance(v,str) else v for v in yourDict.values()]))

Этот код может обрабатывать многотипные значения, поэтому он не будет обрабатывать int, float и т. Д.

0 голосов
/ 20 ноября 2017

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

# strip any type of object
def strip_all(x):
  if isinstance(x, str): # if using python2 replace str with basestring to include unicode type
    x = x.strip()
  elif isinstance(x, list):
    x = [strip_all(v) for v in x]
  elif isinstance(x, dict):
    for k, v in x.iteritems():
      x.pop(k)  # also strip keys
      x[ strip_all(k) ] = strip_all(v)
  return x
0 голосов
/ 25 августа 2017

Хотя у @zquare был лучший ответ на этот вопрос, я чувствую, что мне нужно вмешаться с помощью метода Pythonic, который также будет учитывать значения словаря, которые не являются строками.Это не является рекурсивным, поскольку работает только с одномерными объектами словаря.

d.update({k: v.lstrip() for k, v in d.items() if isinstance(v, str) and v.startswith(' ')})

Это обновляет исходное значение словаря, если значение является строкой и начинается с пробела.ОБНОВЛЕНИЕ: Если вы хотите использовать регулярные выражения и избегать использования, начинается с и заканчивается с.Вы можете использовать это:

import re
rex = re.compile(r'^\s|\s$')
d.update({k: v.strip() for k, v in d.items() if isinstance(v, str) and rex.search(v)})

Эта версия удаляется, если значение имеет начальный или конечный символ пробела.

...