How to remove \n
from a list element?
我试图让python从.txt文件中读取一行,并将第一行的元素写入一个列表。文件中的元素是制表符分隔的,因此我使用了
我目前的问题是,它显示的每个列表如下:
1 2 | ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n '] |
如何从列表的最后一个元素中删除
如果只想从最后一个元素中删除
1 | t[-1] = t[-1].strip() |
如果要从所有元素中删除
1 | t = map(lambda s: s.strip(), t) |
您还可以考虑在拆分行之前删除
1 2 | line = line.strip() # split line... |
从python3起
1 2 | >>> map(lambda x:x.strip(),l) <map object at 0x7f00b1839fd0> |
您可以在python 3.0的新功能上阅读更多关于它的信息。
map() andfilter() return iterators. If you really need alist , a quick fix is e.g.list(map(...))
那么现在是什么方法来解决这个问题呢?
案例1-呼叫
1 2 3 4 | >>> l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3 '] >>> list(map(lambda x:x.strip(),l)) ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3'] |
很好,我们得到输出。现在我们检查运行这段代码所需的时间。
1 2 3 | $ python3 -m timeit"l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3 '];list(map(lambda x:x.strip(),l))" 100000 loops, best of 3: 2.22 usec per loop |
2.22微秒。那还不错。但是有更有效的方法吗?
案例2-不带A的呼叫
在python社区(包括guido)中,许多人都不喜欢使用
不使用
1 2 | >>> list(map(str.strip,l)) ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3'] |
现在是团队。
1 2 3 | $ python3 -m timeit"l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3 '];list(map(str.strip,l))" 1000000 loops, best of 3: 1.38 usec per loop |
好极了!你可以看到这两种方法的效率差异。它快了近60%。因此,不使用
案例3-遵循指导原则,常规方法
python 3.0的另一个重要特点是它建议我们尽可能避免使用
Particularly tricky is
map() invoked for the side effects of the
function; the correct transformation is to use a regularfor loop
(since creating a list would just be wasteful).
因此,我们可以通过使用一个规则的循环来解决这个问题,而不需要一个
解决(暴力)的简单方法是:
1 2 3 4 5 6 7 8 | >>> l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3 '] >>> 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'] |
正时设置。
1 2 3 4 5 6 7 8 | def f(): l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3 '] final_list = [] for i in l: final_list.append(i.strip()) import timeit print(min(timeit.repeat("f()","from __main__ import f"))) |
以及结果。
1 | 1.5322505849981098 |
如你所见,这里的蛮力有点慢。但是对于普通程序员来说,它绝对比一个子句更可读。
案例4-列出理解
这里的理解列表也是可能的,与python2相同。
1 2 | >>> [i.strip() for i in l] ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3'] |
现在开始计时:
1 2 3 | $ python3 -m timeit"l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3 '];[i.strip() for i in l]" 1000000 loops, best of 3: 1.28 usec per loop |
如您所见,列表-理解比
案例5:就地机制和空间效率(t-m-t)
最后一种方法是在列表中进行适当的更改。这将节省大量的内存空间。这可以使用
1 2 3 4 5 6 7 | >>> l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3 '] >>> 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'] |
定时结果将是
结论
计时的比较列表(python 3.4.3和python 3.5.0)
1 2 3 4 5 6 7 8 9 | ---------------------------------------------------- |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 | ---------------------------------------------------- |
最后请注意,列表理解是最好的方法,而使用
听起来您想要Perl函数。
在python中,这很简单:
1 2 3 | def chomp(s): return s[:-1] if s.endswith(' ') else s |
……假设您使用的是Python2.6或更高版本。否则只需稍微使用更详细:
1 2 3 4 5 6 | def chomp(s): if s.endwith(' '): return s[:-1] else: return s |
如果要从字符串末尾删除所有新行(在奇数情况下,由于某些原因,可能会有多个尾随新行):
1 2 3 | def chomps(s): return s.rstrip(' ') |
显然,您不应该看到任何正常的python文件对象的
我看到人们盲目地从文件和类似功能的结果中删除最后一个字符(使用切片)。这是一个坏主意,因为它会导致文件最后一行出错(在文件以换行符以外的任何内容结尾的情况下)。
一开始,当你盲目地从你读过的行中去掉最后的字符时,你可能会被哄骗到一种虚假的安全感。如果使用普通的文本编辑器创建测试套件文件,那么大多数文件都会在最后一行的末尾自动添加新行。要创建有效的测试文件,请使用以下代码:
1 2 3 | f = open('sometest.txt', 'w') f.write('some text') f.close() |
……然后,如果您重新打开该文件并在其上使用
由于无法解释以非换行符结尾的文本文件,许多Unix实用程序和脚本语言多年来一直受到困扰。这是一个愚蠢的基于角落的bug,它潜入代码中的频率仅足以成为有害程序,但不足以让人们从中学习。我们可以争辩说,没有最终换行的"文本"文件是"损坏的"或非标准的;这可能对某些编程规范有效。
然而,在我们的代码中忽略角落的情况是非常容易的,并且这种无知会咬到那些以后依赖于您的代码的人。正如我妻子所说:说到编程…练习安全六角形!
使用列表理解:
1 2 3 4 | myList = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3 '] [(el.strip()) for el in myList] |
通过此链接:
您可以使用rstrip()方法。例子
1 2 3 4 | mystring ="hello " print(mystring.rstrip(' ')) |
这也会起作用,
1 2 3 4 | f=open('in.txt','r') for line in f: parline = line[:-1].split(',') |
str.strip()删除空白字符。也可以将自定义字符作为参数传递给strip。strip函数删除字符串两端的空白/自定义字符。lstrip()和rstrip()分别是左条函数和右条函数。
如:
1 2 3 | test_str ="Vishaka " test_str = test_str.strip() |
测试现在的维沙卡
你可以的-
1 2 3 4 | DELIMITER = '\t' lines = list() for line in open('file.txt'): lines.append(line.strip().split(DELIMITER)) |
我们也可以使用列表理解来使这个更紧凑。
1 | lines = [ line.strip().split(DELIMITER) for line in open('file.txt')] |
作为另一种方法,如果您知道数据中没有空格,那么您可以使用split()(不带参数)。这将在空白处进行拆分,并使用比其他版本的拆分更有效的算法。它还从两端剥离空白。
1 | line = line.split() |
就这样。
访问集合的最后一个元素,然后将值存储在变量中。
所以你有:
1 2 | fileName = '7.3 ' |
那就做:
1 | fileName.strip() |
这将使您获得
您可以使用
1 2 3 4 5 6 | new_list = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3 '] for i in range(len(new_list)): new_list[i]=new_list[i].replace(' ','') print(new_list) |
输出如下
1 | ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3'] |
因为op的问题是从最后一个元素中剥离换行符,所以我将使用
1 2 3 4 5 | >>> the_list = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3 '] >>> the_list[-1] = ls[-1].rstrip() >>> the_list ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3'] |
是O(1)。
要处理许多换行分隔符,包括字符组合,如
,请使用splitlines。合并联接和拆分线以从字符串中删除/替换所有换行符
1 | ''.join(s.splitlines()) |
要只删除一个尾随换行符,请将
1 2 3 4 5 6 7 | def chomp(s): if len(s): lines = s.splitlines(True) last = lines.pop() return ''.join(lines + last.splitlines()) else: return '' |
我遇到了这个问题,并使用上面描述的chomp函数解决了它:
1 2 3 4 5 6 7 8 9 10 11 12 | def chomp(s): return s[:-1] if s.endswith(' ') 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) .... |
此操作用于从列表中的项目中删除
1 2 3 4 5 | def remove_end(s): templist=[] for i in s: templist.append(i) return(templist[0]) |