如何从列表元素中删除\ n?

我试图从一个.txt文件的Python读取行,并将第一行的元素写入列表。 文件中的元素是制表符分隔的,所以我用split("\t")来分隔元素。 由于.txt文件有很多元素,我将每行中的数据保存到一个单独的列表中。

我现在的问题是,它显示每个像这样的列表:

 ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'] 

我怎样才能从列表的最后一个元素中删除\n ,使它只是'7.3'

如果您只想从最后一个元素中删除\n ,请使用以下命令:

 t[-1] = t[-1].strip() 

如果你想从所有的元素中删除\n ,使用这个:

 t = map(lambda s: s.strip(), t) 

您也可以考虑分割线之前删除\n

 line = line.strip() # split line... 

从Python3开始

map不再返回一个list而是一个mapObject ,因此答案看起来像这样

 >>> map(lambda x:x.strip(),l) <map object at 0x7f00b1839fd0> 

你可以阅读关于Python 3.0新增function的更多信息。

map()filter()返回迭代器。 如果你真的需要一个list ,一个快速修复是例如list(map(...))

那么现在有什么方法来得到这个呢?


案例1 – list调用lambda map

map返回一个迭代器list是一个可以将迭代器转换为list的函数。 因此,您需要围绕map进行list调用。 所以现在的答案变成了,

 >>> l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'] >>> list(map(lambda x:x.strip(),l)) ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3'] 

非常好,我们得到的输出。 现在我们检查这段代码执行的时间。

 $ python3 -m timeit "l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'];list(map(lambda x:x.strip(),l))" 100000 loops, best of 3: 2.22 usec per loop 

2.22微秒。 这并不坏。 但是有没有更有效的方法?


案例2 – list调用map没有lambda

lambda被Python社区(包括Guido )中的许多人所诟病 。 除此之外,这将大大降低计划的速度。 因此,我们需要尽可能避免这种情况。 顶层函数str.strip 。 在这里来我们的援助。

不需要使用str.strip as来使用lambda就可以重写map

 >>> list(map(str.strip,l)) ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3'] 

现在是时候了。

 $ python3 -m timeit "l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'];list(map(str.strip,l))" 1000000 loops, best of 3: 1.38 usec per loop 

太棒了。 你可以看到两种方式之间的效率差异。 它快了近60%。 因此,这里不使用lambda的方法是一个更好的select。


案例3 – 遵循指导方针,规则的方式

Python 3.0新增function的另一个重点是它build议我们尽可能避免使用map

特别棘手的是map()调用函数的副作用; 正确的转换是使用一个常规for循环(因为创build一个列表将是浪费)。

所以我们可以通过使用一个普通的for循环来解决这个问题。

解决(蛮力)的微不足道的方法是:

 >>> l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'] >>> final_list = [] >>> for i in l: ... final_list.append(i.strip()) ... >>> final_list ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3'] 

时间安排

 def f(): l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'] final_list = [] for i in l: final_list.append(i.strip()) import timeit print(min(timeit.repeat("f()","from __main__ import f"))) 

结果。

 1.5322505849981098 

正如你所看到的,这里的蛮力有点慢。 但是对于一个普通的程序员来说,它比map子句更具可读性。


案例4 – 列表理解

这里的列表理解也是可能的,并且与Python2中的相同。

 >>> [i.strip() for i in l] ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3'] 

现在的时机:

 $ python3 -m timeit "l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'];[i.strip() for i in l]" 1000000 loops, best of 3: 1.28 usec per loop 

正如你所看到的,列表理解比map更有效(甚至没有lambda )。 因此,Python3中的拇指规则是使用列表理解而不是map


案例5 – 就地机制和空间效率( TMT )

最后的方法是在列表本身内部进行更改。 这将节省大量的内存空间。 这可以使用enumerate来完成。

 >>> l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'] >>> for i,s in enumerate(l): ... l[i] = s.strip() ... >>> l ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3'] 

时间结果将是1.4806894720022683 。 但是,这种方式是有效的。


结论

比较时间列表(Python 3.4.3和Python 3.5.0)

 ---------------------------------------------------- |Case| method | Py3.4 |Place| Py3.5 |Place| |----|-----------------|-------|-----|-------|-----| | 1 | map with lambda | 2.22u | 5 | 2.85u | 5 | | 2 | map w/o lambda | 1.38u | 2 | 2.00u | 2 | | 3 | brute-force | 1.53u | 4 | 2.22u | 4 | | 4 | list comp | 1.28u | 1 | 1.25u | 1 | | 5 | in-place | 1.48u | 3 | 2.14u | 3 | ---------------------------------------------------- 

最后要注意的是,列表理解是最好的方式,使用lambdamap是最差的。 但是, 只有在PYTHON3

这听起来像你想要的东西像Perl chomp()函数。

在Python中这么做是微不足道的:

 def chomp(s): return s[:-1] if s.endswith('\n') else s 

假设你正在使用Python 2.6或更高版本。 否则,请稍微详细一点:

 def chomp(s): if s.endwith('\n'): return s[:-1] else: return s 

如果你想从一个string的尾部删除所有新行(在奇怪的情况下,由于某种原因可能有多个尾随换行符):

 def chomps(s): return s.rstrip('\n') 

显然你不应该看到任何普通的Python文件对象的readline()readlines()方法返回这样的string。

我已经看到人们盲目地从文件readline()和类似的函数的结果中删除最后的字符(使用s[:-1]片)。 这是一个坏主意,因为它可能导致文件的最后一行发生错误(在文件以非换行符结束的情况下)。

起初,如果盲目地把最后的字符从你读过的行中剥离出来,你可能会陷入一种错误的安全感。 如果你使用普通的文本编辑器来创build你的testing套件文件,你会在最后一行的最后添加一个新行。 要创build一个有效的testing文件,请使用如下代码:

 f = open('sometest.txt', 'w') f.write('some text') f.close() 

…然后,如果您重新打开该文件,并使用readline()readlines()文件方法,则会发现文本在没有尾随换行符的情况下被读取。

这种以非换行字符结尾的文本文件的失败已经困扰了许多UNIX公用事业和脚本语言多年。 这是一个愚蠢的angular落基本错误,经常爬进代码是足够的有害生物,但往往不足以让人们从中学习。 我们可以争辩说没有最终换行符的“文本”文件是“腐败的”或者是非标准的; 这对某些编程规范可能是有效的。

然而,在我们的编码中忽略angular落案例太容易了,并且让那些依赖于你的代码的人以后会无知。 正如我的妻子所说:编程时…练习安全的hex!

使用列表理解:

 myList = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'] [(el.strip()) for el in myList] 

从这个链接 :

你可以使用rstrip()方法。 例

 mystring = "hello\n" print(mystring.rstrip('\n')) 

作为另一种方法,如果您知道数据中没有空格,那么您可以使用split()(不带参数)。 这在白色空间分裂,并使用比其他版本的拆分更有效的algorithm。 它也从两端剥去空白。

 line = line.split() 

就是这样。

你可以做 –

 DELIMITER = '\t' lines = list() for line in open('file.txt'): lines.append(line.strip().split(DELIMITER)) 

这些lines已经获得了您的文件的所有内容。

也可以使用列表parsing来使这个更紧凑。

 lines = [ line.strip().split(DELIMITER) for line in open('file.txt')] 

这也将工作,

 f=open('in.txt','r') for line in f: parline = line[:-1].split(',') 

str.strip()删除空白字符。 您也可以将自定义字符作为parameter passing给strip。 strip函数删除string两端的空白/自定义字符。 lstrip()和rstrip()分别是strip和right strip函数。

例如:

 test_str = "Vishaka\n" test_str = test_str.strip() 

test_str现在是Vishaka

您访问该集合的最后一个元素,然后将该值存储在一个variables中。

所以你有:

 fileName = '7.3\n' 

那么就做:

 fileName.strip() 

这将使你与7.3 。 然后将该值存回该集合的最后一个元素。

您可以使用lstrip()rstrip()来移除左侧或右侧。

这工作取出\n (新行)closures列表中的项目,它只是把第一个项目在stringclosures

 def remove_end(s): templist=[] for i in s: templist.append(i) return(templist[0]) 

我有这个问题,并使用上述chomp函数解决它:

 def chomp(s): return s[:-1] if s.endswith('\n') else s def trim_newlines(slist): for i in range(len(slist)): slist[i] = chomp(slist[i]) return slist ..... names = theFile.readlines() names = trim_newlines(names) .... 

要处理许多换行符分隔符,包括\r\n等字符组合,请使用分隔符。 结合连接和拆分来删除/replacestrings所有换行符:

 ''.join(s.splitlines()) 

要删除一个尾随的换行符,传递True作为保留分隔符的参数,只删除最后一行的分隔符:

 def chomp(s): if len(s): lines = s.splitlines(True) last = lines.pop() return ''.join(lines + last.splitlines()) else: return ''