在python中删除字符串中的空白字符
我有嵌套列表。在此列表中,每个嵌套列表包含两个组件,每个组件可能包含空白(“”)字符。我想删除并编写一段代码,但无法使其工作。如何克服此问题 列表的嵌套列表为:在python中删除字符串中的空白字符,python,Python,我有嵌套列表。在此列表中,每个嵌套列表包含两个组件,每个组件可能包含空白(“”)字符。我想删除并编写一段代码,但无法使其工作。如何克服此问题 列表的嵌套列表为: [['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'],
[['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
def空白(des):
a=0
而a
使用来代替
循环
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
有关最后一段代码的更多信息,请参见。这是一种方法:
map(lambda x:map(lambda y:y.replace(' ','') if isinstance(y,str) else y,x),a)
其中
a
是您传递的输入列表。好的,因为没有限制或任何固定参数,所以您必须使用一点递归来解决问题
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
试试这个:
def removeBlanks(input):
if type(input) is list:
ret=[]
for i in input:
ret.append(removeBlanks(i))
else:
ret=input.replace(" ", "")
return ret
在python中,您通常希望跟踪并捕获异常,而不是使用
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
可能是更好的数据选择。使用isinstance()而不是type(…)==将示例数据正确格式化,并准确编写所需内容。无论是代码、数据还是问题都没有多大意义。他似乎只是想去掉嵌套列表中字符串中的所有空格。因此,'2*轮+1*帧'
变成了'2*轮+1*帧'
,依此类推。嵌套级别是固定的还是可变的?出于某种原因,类型(列表[i])==list
对我不起作用。不知道,但这是有效的@kycklysf:只是出于兴趣,你在构建类似的东西吗?@kycklysf:在这种情况下,我建议使用嵌套字典而不是字符串,比如{'bike':{'wheel':2,'frame':1},'wheel':{'rim':1
等等。实际上,我想做一个你建议的算法是什么?@kycklysf:你最好问一个新问题(但先自己尝试一下)。根据我的问题,我得到一个空白的删除嵌套列表,然后我的目的是将列表转换为与上面链接相同的树。