迭代python中的字典并剥离空白区域

问题描述 投票:5回答:7

我正在使用网络抓取框架Scrapy,当涉及到python时,我有点像菜鸟。所以我想知道如何迭代所有似乎在字典中的已删除项目并从每个项目中删除空白区域。

这是我在项目管道中一直在玩的代码:

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

但是这段代码不起作用,因为我无法单独选择项目。所以我试着这样做:

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

第二种方法在某种程度上起作用,但问题是我不知道如何循环遍历所有值。

我知道这可能是一个很容易解决的问题,但我似乎无法找到它。任何帮助将不胜感激。 :)

python dictionary whitespace scrapy
7个回答
2
投票

不是问题的直接答案,但我建议你看看Item Loaders和输入/输出处理器。你可以在这里完成很多清理工作。

剥离每个条目的示例是:

class ItemLoader(ItemLoader):

    default_output_processor = MapCompose(unicode.strip)

17
投票

在字典理解中(Python> = 2.7):

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

Python xx:

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

2
投票

你应该注意的是lstrip()返回字符串的副本而不是修改对象。要实际更新字典,您需要将剥离的值分配回项目。

例如:

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

请注意使用.iteritems()返回迭代器而不是键值对列表。这使它更有效率。

我应该补充说,in Python3, .item() has been changed to return "views".iteritems()不是必需的。


2
投票

尝试

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

或者以monkut建议的综合方式:

newDic = {k,v.replace(' ','') for k,v in item.items()}

1
投票

假设您想剥离yourDict的值,创建一个名为dict的新newDict

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

此代码可以处理多类型值,因此将避免剥离intfloat等。


0
投票

虽然@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)})

如果值具有前导或尾随空格字符,则此版本将剥离。


0
投票

我使用以下内容。您可以将任何对象作为参数传递,包括字符串,列表或字典。

# 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
© www.soinside.com 2019 - 2024. All rights reserved.