从 python 列表中的多个字符串项中删除空格

Removing spaces from multiple string items in a list in python

我在 python 中有一个字符串项目列表:

positions = ['CF', 'LCMF', 'RW', 'AMF', 'LW', ' RAMF', ' LCMF', ' AMF', ' RB']

我想从包含 space 的项目中删除 space(例如 ' RAMF')。

我已经尝试使用以下代码:

positions = [x.strip(' ') for x in positions]
# AttributeError: 'NoneType' object has no attribute 'strip'

player_positions = [x.text.strip(' ') for x in player_positions]
# AttributeError: 'str' object has no attribute 'text'

positions = map(str.strip, positions)
# <map at 0x7fde15d19a90>

如何在此处删除任何包含 space 的列表项中的 space?

尝试使用我在下面提到的字符串替换功能。

positions = ['CF', 'LCMF', 'RW', 'AMF', 'LW', ' RAMF', ' LCMF', ' AMF', ' RB']

print([position.replace(' ','') for position in positions])

解决方案(已编辑):

positions = ['CF', 'LCMF', 'RW', 'AMF', 'LW', ' RAMF', ' LCMF', ' AMF', ' RB']    
positions = [x.strip(" ") for x in positions]

我推测您的实际列表中可能包含一些不是字符串的项目。使用此列表理解将它们清除:

bad_positions = [p for p in positions if not isinstance(p, str)]

这个问题可能有歧义,所以我将提供 3 个选项:

positions = ['CF', 'LCMF', 'RW', 'AMF', 'LW', ' RAMF', ' LCMF', ' AMF', ' RB']

# replace all/any spaces
positions = [p.replace(' ', '') for p in positions]
# remove leading and trailing spaces
positions = [p.strip(' ') for p in positions]
# remove leading and trailing whitespace
positions = [p.strip() for p in positions]

您给定的列表

positions = ['CF', 'LCMF', 'RW', 'AMF', 'LW', ' RAMF', ' LCMF', ' AMF', ' RB']

并且代码不会导致您的 所有 错误。特别是

positions = [x.strip(' ') for x in positions]

会很简单。


这可以从您的消息中扣除:

positions = [x.strip(' ') for x in positions]
# AttributeError: 'NoneType' object has no attribute 'strip'

错误告诉您 positions 中至少有一个元素是 None - 而不是字符串。

player_positions = [x.text.strip(' ') for x in player_positions]
# AttributeError: 'str' object has no attribute 'text'

错误告诉您 player_positions 中至少有一个元素是字符串 - 字符串没有属性 text。如果 player_positions positions 相同,则意味着 None 值之前至少有 1 个字符串值。

positions = map(str.strip, positions)
# <map at 0x7fde15d19a90>

map in python returns 一个迭代器 - 该函数在您迭代它时应用于您的值 - 这就是为什么您还没有例外的原因。如果迭代,这会产生与第一个 list._

类似的错误

你会得到所有的错误:

p = ['CF', None, 'LCMF', 'RW', 'AMF', 'LW', ' RAMF', ' LCMF', ' AMF', ' RB']

try:
    p1  = [x.strip(' ') for x in p]
except Exception as e:
    print(type(e), e)

==> <class 'AttributeError'> 'NoneType' object has no attribute 'strip'

try:
    p2  = [x.text.strip(' ') for x in p]
except Exception as e:
    print(type(e), e)

==> <class 'AttributeError'> 'str' object has no attribute 'text'

try:
    p3  = map(str.strip, p)
    p3l = list(p3)
except Exception as e:
    print(type(e), e)

==> <class 'TypeError'> descriptor 'strip' for 'str' objects doesn't apply to a 'NoneType' object 类似于 <class 'AttributeError'> 'NoneType' object has no attribute 'strip'


从您的数据中过滤掉 None 值可能是您的最佳猜测:

filtered_pos = [p for p in positions if p is not None]

如果你的数据中只有字符串和 None,你应该没问题。

如果您需要保持 non-strings/None 完整,请仅将 strip() 应用于字符串:

p = ['CF', None, 'LCMF', 42, 'AMF', 'LW', ' RAMF', ' LCMF', ' AMF', ' RB']

p1  = [x.strip(' ') if isinstance(x, str) else x for x in p]

print(p1)

将只更改字符串而不会改变其他字符串:

['CF', None, 'LCMF', 42, 'AMF', 'LW', 'RAMF', 'LCMF', 'AMF', 'RB']