Python str.strip功能失调吗

Python str.strip功能失调吗,python,functional-programming,strip,Python,Functional Programming,Strip,我有一个从字符串拆分操作生成的列表,我想把它输入到map函数中,然后从后面的括号和空格中去掉这些子字符串。 并从中重建一个列表 teststring=" (A) / (B) " result = list(map(str.strip, teststring.split("/"), " ()")) 但最后,我只是奇怪地剥离了子字符串,而所有的组合都进行了测试,如docs所述 我知道列表理解还有另一种方法: result = [substr.strip(' ()' for substr in te

我有一个从字符串拆分操作生成的列表,我想把它输入到map函数中,然后从后面的括号和空格中去掉这些子字符串。 并从中重建一个列表

teststring=" (A) / (B) "
result = list(map(str.strip, teststring.split("/"), " ()"))
但最后,我只是奇怪地剥离了子字符串,而所有的组合都进行了测试,如docs所述

我知道列表理解还有另一种方法:

result = [substr.strip(' ()' for substr in teststring.split("/")]  
哪个有效。。但我想知道为什么地图不能正常工作

我使用的是python 3.6.4,在windows64上使用的是Anaconda 4.4

附属问题;下面给出了一些查找函数源代码的指针。但是我找不到map的代码,通常是内置函数的代码,所以我看不出其中是否有bug…

带有3个参数的map的行为与您认为的不一样。map的第三个参数不是作为第一个参数提供的函数的参数。它用作第二个可数

从:

映射函数,iterable。。。返回应用函数的迭代器 对iterable的每一项,都会产生结果。如果额外 如果传递了iterable参数,则函数必须接受这么多参数 并并行应用于所有iterables中的项。具有 多个iterable,当最短iterable为 筋疲力尽的对于已经安排了功能输入的情况 有关参数元组,请参见itertools.starmap

换言之:

mapstr.strip、teststring.split“/”、“”与

[teststring.split'/'中substr的substr.strip''。它相当于

[zipteststring.split/,''中的substr_1.strip、substr_2.strip用于substr_1、substr_2]

看到区别了吗?

带有3个参数的映射的行为与您认为的不同。map的第三个参数不是作为第一个参数提供的函数的参数。它用作第二个可数

从:

映射函数,iterable。。。返回应用函数的迭代器 对iterable的每一项,都会产生结果。如果额外 如果传递了iterable参数,则函数必须接受这么多参数 并并行应用于所有iterables中的项。具有 多个iterable,当最短iterable为 筋疲力尽的对于已经安排了功能输入的情况 有关参数元组,请参见itertools.starmap

换言之:

mapstr.strip、teststring.split“/”、“”与

[teststring.split'/'中substr的substr.strip''。它相当于

[zipteststring.split/,''中的substr_1.strip、substr_2.strip用于substr_1、substr_2]

看到区别了吗?

地图的工作原理与您使用它的方式不同。当你使用mapf,a,b时,它会产生fa[0],b[0],fa[1],b[1],…,而你使用它时,就像它会产生fa[0],b,fa[1],b

要解决这个问题,您可以使用列表理解,如问题中所示,或者使用lambda-like-lambda-string:string.strip。

映射的工作方式与您使用它的方式不同。当你使用mapf,a,b时,它会产生fa[0],b[0],fa[1],b[1],…,而你使用它时,就像它会产生fa[0],b,fa[1],b


要解决这个问题,您可以使用列表理解(如问题中所述)或lambda-like-lambda-string:string.strip。

问题在于,您似乎觉得要映射的最后一个参数是作为参数传递给要映射的函数的,而这不是从文档中发生的:

mapfunc,*iterables->map对象

制作一个迭代器,使用每个函数的参数计算函数 伊泰伯勒斯的。当最短iterable耗尽时停止

换句话说,listmapf[1,2,3],“abc”相当于:

[f(1,'a'), f(2, 'b'), f(3, 'c')]
这不是你想要的。您希望部分应用string.strip作为第二个参数,但实际上,它被作为另一个iterable参数。因此,简单的解决方案是使用辅助函数:

In [9]: def strip_stuff(s):
   ...:     return s.strip(" ()")
   ...:

In [10]: list(map(strip_stuff, teststring.split("/")))
Out[10]: ['A', 'B']
如果需要灵活,您可以使用因子函数:

In [12]: def make_strip(stuff):
    ...:     def strip(s):
    ...:         return s.strip(stuff)
    ...:     return strip
    ...:

In [13]: list(map(make_strip(" ()"), teststring.split("/")))
Out[13]: ['A', 'B']

In [14]: list(map(make_strip("()"), teststring.split("/")))
Out[14]: [' (A) ', ' (B) ']

In [15]: list(map(make_strip(" )"), teststring.split("/")))
Out[15]: ['(A', '(B']

In [16]: list(map(make_strip(" ("), teststring.split("/")))
Out[16]: ['A)', 'B)']

问题在于,您似乎觉得映射的最后一个参数是作为参数传递给被映射的函数的,而不是从文档中发生的:

mapfunc,*iterables->map对象

制作一个迭代器,使用每个函数的参数计算函数 伊泰伯勒斯的。当最短iterable耗尽时停止

换句话说,listmapf[1,2,3],“abc”相当于:

[f(1,'a'), f(2, 'b'), f(3, 'c')]
这不是你想要的。您希望部分应用string.strip作为第二个参数,但实际上,它被作为另一个iterable参数。因此,简单的解决方案是使用辅助函数:

In [9]: def strip_stuff(s):
   ...:     return s.strip(" ()")
   ...:

In [10]: list(map(strip_stuff, teststring.split("/")))
Out[10]: ['A', 'B']
如果需要灵活,您可以使用因子函数:

In [12]: def make_strip(stuff):
    ...:     def strip(s):
    ...:         return s.strip(stuff)
    ...:     return strip
    ...:

In [13]: list(map(make_strip(" ()"), teststring.split("/")))
Out[13]: ['A', 'B']

In [14]: list(map(make_strip("()"), teststring.split("/")))
Out[14]: [' (A) ', ' (B) ']

In [15]: list(map(make_strip(" )"), teststring.split("/")))
Out[15]: ['(A', '(B']

In [16]: list(map(make_strip(" ("), teststring.split("/")))
Out[16]: ['A)', 'B)']
您可以使用operator.methodcaller:

您可以使用operator.methodcaller:

使用lambda函数,它可以是ac 结果如下:

map(lambda s: s.strip(" ()"), teststring.split("/"))
使用lambda函数,可实现以下功能:

map(lambda s: s.strip(" ()"), teststring.split("/"))

您希望mapstr.strip、teststring.split/做什么?当你给map多个iterable时,它会像zip一样并行地迭代它们。你希望mapstr.strip、teststring.split/做什么?当你给map多个iterable时,它会像zip一样并行地迭代它们。当然,使用map和lambda这样的函数会比等价的list comp慢,因为list comp避免了额外的Python函数调用。当然,使用map和lambda这样的函数会比等价的list comp慢,因为列表comp避免了额外的Python函数调用。这在这里不是很有用!这在这里不是很有用!谢谢我严重误解了文件中的“iterable”。我想如果我不想使用列表理解,我可以通过zip和星图实现我想要的,但事实上列表理解更好。@AndoJurai不,zip+星图可以做与您在这里所做的相同的事情!也就是说,mapf,iterable1,iterable2相当于starmapf,zipiterable1,iterable2我的意思是使用类似starmapstr.strip,zipteststring.split,repeat的东西。当数据是元组时,星图可以工作,但如果每次都输入星图,就可以了。谢谢。我严重误解了文件中的“iterable”。我想如果我不想使用列表理解,我可以通过zip和星图实现我想要的,但事实上列表理解更好。@AndoJurai不,zip+星图可以做与您在这里所做的相同的事情!也就是说,mapf,iterable1,iterable2相当于starmapf,zipiterable1,iterable2我的意思是使用类似starmapstr.strip,zipteststring.split,repeat的东西。当数据是元组时,星图可以工作,但如果每次都输入星图,就可以了。