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

Mr *_*tan 64 python newline list

我正在尝试将Python从.txt文件中读取到读取行,并将第一行的元素写入列表.文件中的元素是制表符分隔的,所以我习惯split("\t")将元素分开.因为.txt文件有很多元素,所以我将每行中找到的数据保存到一个单独的列表中.

我目前遇到的问题是它显示每个列表如下:

['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n']
Run Code Online (Sandbox Code Playgroud)

如何\n从列表的最后一个元素中删除并将其删除'7.3'

Bol*_*olo 127

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

t[-1] = t[-1].strip()
Run Code Online (Sandbox Code Playgroud)

如果\n要从所有元素中删除,请使用以下命令:

t = map(lambda s: s.strip(), t)
Run Code Online (Sandbox Code Playgroud)

您可能还会考虑\n 拆分线之前删除:

line = line.strip()
# split line...
Run Code Online (Sandbox Code Playgroud)

  • 如果我要遍历列表,我会使用`[s.strip()for s in t]`.我定时了,处理`["s \n"]*10000`与`map`的9.73毫秒是5.33毫秒.如果映射内置函数,`map`将获胜. (7认同)
  • 我会在分裂之前做一个剥离......我觉得它更简洁. (4认同)
  • `line = line.strip()`将删除所有TRAILING WHITESPACE.这是屠杀.阅读Jim Dennis的回答. (3认同)
  • 好哇!有用!非常感谢你. (2认同)

Bha*_*Rao 37

从Python3开始

map不再返回a list而是a mapObject,因此答案看起来像

>>> map(lambda x:x.strip(),l)
<map object at 0x7f00b1839fd0>
Run Code Online (Sandbox Code Playgroud)

您可以在Python 3.0的新功能中阅读更多相关信息.

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

那么现在有什么方法可以解决这个问题呢?


案例1 - 用a list调用maplambda

map返回一个迭代器.list是一个可以将迭代器转换为列表的函数.因此,您需要打包一个list电话map.所以答案现在变成,

>>> 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']
Run Code Online (Sandbox Code Playgroud)

很好,我们得到了输出.现在我们检查这段代码执行所需的时间.

$ 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
Run Code Online (Sandbox Code Playgroud)

2.22微秒.那不是那么糟糕.但是有更有效的方法吗?


案例2 - 没有a 的list呼叫maplambda

lambda许多人都对Python社区(包括Guido)不满意.除此之外,它将大大降低程序的速度.因此,我们需要尽可能避免这种情况.顶级功能str.strip.来帮助我们.

map可重写不使用lambda使用str.strip作为

>>> list(map(str.strip,l))
['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']
Run Code Online (Sandbox Code Playgroud)

现在是时候了.

$ 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
Run Code Online (Sandbox Code Playgroud)

太棒了.您可以看到两种方式之间的效率差异.它快了近60%.因此,不使用a的方法lambda在这里是更好的选择.


案例3 - 遵循指南,常规方式

来自Python 3.0的新功能的另一个重点是它建议我们尽可能避免map.

特别棘手的是map()函数的副作用; 正确的转换是使用常规for循环(因为创建列表只会浪费).

所以我们可以在没有map使用常规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']
Run Code Online (Sandbox Code Playgroud)

时间设置

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")))
Run Code Online (Sandbox Code Playgroud)

结果.

1.5322505849981098
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,蛮力有点慢.但它对于普通程序员来说肯定比一个map子句更具可读性.


案例4 - 列表理解

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

>>> [i.strip() for i in l]
['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']
Run Code Online (Sandbox Code Playgroud)

现在为时间安排:

$ 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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,列表理解比map(即使没有a 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']
Run Code Online (Sandbox Code Playgroud)

时间结果将是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   |
----------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

最后请注意,列表理解是最好的方法,map使用lambda是最差的.但是再次--- 只在PYTHON3


Jim*_*nis 11

听起来你想要像Perl这样的chomp()功能.

在Python中这很简单:

def chomp(s):
    return s[:-1] if s.endswith('\n') else s
Run Code Online (Sandbox Code Playgroud)

...假设您使用的是Python 2.6或更高版本.否则只需使用稍微冗长的:

def chomp(s):
    if s.endwith('\n'):
        return s[:-1]
    else:
        return s
Run Code Online (Sandbox Code Playgroud)

如果要从字符串末尾删除所有新行(在奇怪的情况下,由于某种原因可能有多个尾随换行符):

def chomps(s):
    return s.rstrip('\n')
Run Code Online (Sandbox Code Playgroud)

显然,你永远不应该看到任何普通的Python文件对象readline()readlines()方法都返回这样的字符串.

我见过人们s[:-1]从文件readline()和类似函数的结果中盲目地删除最后一个字符(使用切片).这是一个坏主意,因为它可能导致文件的最后一行出错(在文件以换行符以外的任何内容结束的情况下).

起初,当你盲目地从你读过的行中剥离最终字符时,你可能会陷入虚假的安全感.如果您使用普通的文本编辑器来创建测试套件文件,那么大多数人都会在最后一行的末尾静默添加换行符.要创建有效的测试文件,请使用以下代码:

f = open('sometest.txt', 'w')
f.write('some text')
f.close()
Run Code Online (Sandbox Code Playgroud)

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

这种以非换行符结尾的文本文件的失败多年来一直困扰着许多UNIX实用程序和脚本语言.这是一个愚蠢的角落基础错误,它常常会成为一种害虫,但通常不足以让人们从中学习.我们可以争辩说,没有最终换行符的"文本"文件是"腐败的"或非标准的; 这可能对某些编程规范有效.

但是,在我们的编码中忽略极端情况并且忽略了那些依赖于您的代码的人会非常容易.正如我的妻子所说:当谈到编程......练习安全的十六进制!


rog*_*pvl 5

使用列表理解:

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

[(el.strip()) for el in myList]
Run Code Online (Sandbox Code Playgroud)