【问题标题】:Iterating over a dictionary in python and stripping white space迭代python中的字典并去除空格
【发布时间】:2012-01-18 09:24:48
【问题描述】:

我正在使用网络抓取框架 Scrapy,我想知道如何遍历所有抓取的项目,这些项目似乎在字典中,并从每个项目中去除空白。

这是我在项目管道中使用的代码:

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

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

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

第二种方法在一定程度上有效,但问题是我不知道如何循环所有值。

我知道这可能很容易解决,但我似乎找不到它。

【问题讨论】:

标签: python dictionary whitespace strip


【解决方案1】:

在字典理解中(在 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()}

【讨论】:

  • 不错。请注意,dict 理解仅在 Python >=2.7 中可用。
  • Shawn,谢谢,我忘了说版本限制。我已添加评论。
【解决方案2】:

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

# 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

【讨论】:

    【解决方案3】:

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

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

    这段代码可以处理多类型值,所以会避免剥离intfloat

    【讨论】:

      【解决方案4】:

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

      剥离每个条目的示例是:

      class ItemLoader(ItemLoader):
      
          default_output_processor = MapCompose(unicode.strip)
      

      【讨论】:

      • 您的答案正是我想要的!太感谢了。即使这不完全是我所要求的......这是我所需要的,它完美地工作。非常感谢!
      【解决方案5】:

      试试

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

      或按照蒙库特建议的综合方式:

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

      【讨论】:

      • 感谢您的帮助。我确实有一个问题,.replace() 函数是否有一些技巧,因为当我尝试使用它时,python 会吐出一个错误,说列表元素没有 atrabute replace()。有什么我需要包括的吗?
      • @AlexW.H.B.:好点!所以最好使用正则表达式,例如 import re 然后 re.sub(r'\s', '', stringWithWhiteSpaces)
      【解决方案6】:

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

      例如:

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

      注意.iteritems() 的使用,它返回一个迭代器而不是键值对列表。这使其效率更高一些。

      我应该添加in Python3, .item() has been changed to return "views",因此不需要.iteritems()

      【讨论】:

      • 我错了还是 strip 只删除前导和尾随字符?
      • @ezdazuzena 确实如此。我只是坚持 OP 的例子,并假设这就是他想要实现的目标。这里的关键信息是剥离/替换的字符串必须重新分配。
      • .. 无论如何,你是对的。虽然我更喜欢蒙库特的理解解决方案;)
      【解决方案7】:

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

      如果值具有前导或尾随空格字符,则此版本会删除。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多