【问题标题】:remove blank characters from a string in python从python中的字符串中删除空白字符
【发布时间】:2013-03-02 20:15:53
【问题描述】:

我有嵌套列表。在这个列表中,每个嵌套列表都包含两个组件,每个组件可能包含空白('')字符。我想删除并编写一段代码但无法使其工作。如何我克服了这个问题?

List 的嵌套列表是:

[['bike', '2 * wheel+1* frame'], ['wheel', '1  * rim + 1* spoke +1 *hub'], ['rim', 60], ['spoke', 120], ['hub', '2*gear+1*axle'], ['gear', 25], ['axle', '5*bolt+7*nut'],['bolt',0.1], ['nut', 0.15],['frame', '1*rearframe+ 1*frontframe'],['rearframe', 175],['frontframe', '1*fork+2*handle'], ['fork', 22.5],['handle', 10.0]]

正如所见,某些字符串中有一些空格。

我写的python代码:

def blanks(des):
    a = 0
    while a < len(des): 
        if type(des[0][1]) == str: 
            des[0][0] = des[0][0].replace(' ','')
        if type(des[0][1]) == str:
            des[0][1] = des[0][1].replace(' ','')
        a += 1

    return des 

【问题讨论】:

  • 使用 isinstance() 代替 type(..) == str
  • 正确格式化您的示例数据并准确编写您想要的内容。
  • 代码、数据和问题都没有多大意义。
  • 看来他只是想摆脱嵌套列表中字符串中的所有空格。所以'2 * wheel+1* frame' 变成了'2*wheel+1*frame',以此类推。
  • 嵌套层级是固定的还是可变的?

标签: python


【解决方案1】:

改用for 循环。

def blanks(lis):
    for i, _ in enumerate(lis):
        for j in range(2):
            if isinstance(lis[i][j], str):
                lis[i][j] = lis[i][j].replace(' ', '')
    return lis

列表推导式也可以。

def blanks(lis):
    return [i.replace(' ', '') if isinstance(i, str) else i for a in lis for i in a]

或者只是没有函数定义:

lis = [[i.replace(' ', '') if isinstance(i, str) else i for i in a] for a in lis]

我认为这应该可以满足您的需求。但是,如果您的嵌套列表的深度不一致,则最好使用生成器函数。

def blanks(lis):
    for i, el in enumerate(lis):
        if isinstance(el, list):
            blanks(el)
        elif isinstance(el, str):
            yield el.replace(' ', '')
        else:
            yield el

有关最后一段代码的更多信息,另请参阅this answer

【讨论】:

    【解决方案2】:

    这是一种方法:

    map(lambda x:map(lambda y:y.replace(' ','') if isinstance(y,str) else y,x),a)
    

    a 是您传递的输入列表。

    【讨论】:

      【解决方案3】:

      试试这个:

      def removeBlanks(input):
      
        if type(input) is list:
          ret=[]
          for i in input:
            ret.append(removeBlanks(i))
        else:
          ret=input.replace(" ", "")
      
        return ret   
      

      【讨论】:

        【解决方案4】:

        好吧,既然没有限制或任何固定参数,您将不得不使用一点递归来解决您的问题。

        def trimSpaces(list):
          for i in range(0,len(list)):
            if type(list[i]) == str:
              list[i] = list[i].replace(' ','')
            elif type(list[i]) == type([]):
              list[i] = trimSpaces(list[i])
            else:
              continue
          return list
        

        【讨论】:

        • 出于某种原因type(list[i]) == list 对我不起作用。不知道,但这行得通!
        【解决方案5】:

        在 python 中,您通常希望遵循 EAFP 并捕获异常,而不是使用 isinstance 预先验证输入:

        def no_blanks(s):
            try:
                return s.replace(' ', '')
            except AttributeError:
                return s
        
        ls = [['bike', '2 * wheel+1* frame'], ['wheel', '1  * rim + 1* spoke +1 *hub'], ['rim', 60], ['spoke', 120], ['hub', '2*gear+1*axle'], ['gear', 25], ['axle', '5*bolt+7*nut'],['bolt',0.1], ['nut', 0.15],['frame', '1*rearframe+ 1*frontframe'],['rearframe', 175],['frontframe', '1*fork+2*handle'], ['fork', 22.5],['handle', 10.0]]
        
        new_ls = [[no_blanks(a), no_blanks(b)] for a, b in ls]
        

        同时仔细查看您的列表,在我看来dict 可能是您数据的更好选择。

        【讨论】:

        • @kycklysf:只是出于兴趣,您是否正在构建类似于stackoverflow.com/q/14273581/989121 的东西?
        • @kycklysf:在这种情况下,我建议使用嵌套字典而不是字符串,例如 {'bike': {'wheel':2, 'frame':1}, 'wheel': {'rim':1
        • 其实我想做stackoverflow.com/questions/14101633/…你会怎么推荐算法?
        • @kycklysf:你最好问一个新的问题(但先自己尝试一下)。
        • 通过我的问题,我得到了一个删除空白的嵌套列表,然后我的目的是将列表转换为与上面的链接相同的树。
        猜你喜欢
        • 2016-05-30
        • 1970-01-01
        • 2018-03-04
        • 2019-06-14
        • 2011-03-24
        • 1970-01-01
        • 1970-01-01
        • 2011-09-21
        • 1970-01-01
        相关资源
        最近更新 更多