如何从列表元素中删除\ 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 | ----------------------------------------------------
最后要注意的是,列表理解是最好的方式,使用lambda
的map
是最差的。 但是, 只有在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 ''