从字符串列表的元素中删除结尾的换行符


122

我必须采用以下形式的大量单词:

['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']

然后使用strip功能,将其转换为:

['this', 'is', 'a', 'list', 'of', 'words']

我以为我写的东西行得通,但是我不断收到错误消息:

“'list'对象没有属性'strip'”

这是我尝试过的代码:

strip_list = []
for lengths in range(1,20):
    strip_list.append(0) #longest word in the text file is 20 characters long
for a in lines:
    strip_list.append(lines[a].strip())

1
请说明为什么要附加0到strip_list19次,然后附加剥离线。该代码具有非常难闻的气味。同样,如果您从文件中获得了这些东西,则应该在进行过程中将其剥离-构建一个大列表,然后将其重新放入另一个大列表中并不是一个好主意。同样,您的代码也不应该依赖于知道最长字/行的长度。退后一步-您要实现什么目标?你会怎么做strip_list
约翰·马钦

Answers:


211
>>> my_list = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']
>>> map(str.strip, my_list)
['this', 'is', 'a', 'list', 'of', 'words']

然后我可以只说stripped_list = map(str.strip,my_list)然后打印stripped_list来打印这个新列表吗?
乔治·伯罗斯

19
但是,如果您使用的是Python 2,请注意,str.strip只有在您确定列表中不包含unicode字符串的情况下,该方法才有效。如果它可以同时包含8位和unicode字符串,请lambda s: s.strip()按上述说明使用,或使用strip可以从strings模块导入的函数。
Cito

Cito评论实际上是最值得代表的评论。map和comprehension列表在OOP中并不等效,因为我们是passe方法,而不是函数。
e-satis 2012年

内置于撒玛利亚人中的地图功能
SIslam 2015年

39
请注意以下几点:如果您使用的是Python 3.x,并且想要返回列表,则必须为list,所以它为list(map(str.strip, my_list))。还要检查一下:link
所以S


64

您可以使用列表推导

strip_list = [item.strip() for item in lines]

map功能:

# with a lambda
strip_list = map(lambda it: it.strip(), lines)

# without a lambda
strip_list = map(str.strip, lines)

3
第二个版本中的lambda是过大的。
gddc 2011年

1
您也可以使用相同的方法来处理0列表开头的值。尽管我真的无法想象您要通过将它们放在相同的结果列表中来完成什么...
Karl Knechtel

4
在Python 3中,第三形式“无lambda”应strip_list = list(map(str.strip, lines))为map()返回地图迭代器。docs.python.org/3/library/functions.html#map
Devy

7

这可以使用PEP 202中定义的列表理解来完成

[w.strip() for w in  ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']]

我正在考虑将名称从更改listmap:)
Casey

3

所有其他答案,主要是关于列表理解的,都很棒。但是只是为了解释您的错误:

strip_list = []
for lengths in range(1,20):
    strip_list.append(0) #longest word in the text file is 20 characters long
for a in lines:
    strip_list.append(lines[a].strip())

a是您列表的成员,而不是索引。您可以这样写:

[...]
for a in lines:
    strip_list.append(a.strip())

另一个重要的评论:您可以通过以下方式创建一个空列表:

strip_list = [0] * 20

但这不是那么有用,因为可以.append 内容追加到列表中。在您的情况下,创建带有默认值的列表是没有用的,因为在附加剥离字符串时,将逐项构建该列表。

因此,您的代码应类似于:

strip_list = []
for a in lines:
    strip_list.append(a.strip())

但是,可以肯定的是,最好的选择就是这个,因为这是完全一样的:

stripped = [line.strip() for line in lines]

如果您遇到的不仅仅是a复杂的事情.strip,请将其放在函数中并执行相同的操作。这是使用列表最易读的方式。


2

如果您只需要删除结尾的空格,则可以使用str.rstrip(),它的效率应比str.strip()

>>> lst = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']
>>> [x.rstrip() for x in lst]
['this', 'is', 'a', 'list', 'of', 'words']
>>> list(map(str.rstrip, lst))
['this', 'is', 'a', 'list', 'of', 'words']

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.