[英]Remove empty string from list
我剛剛開始使用Python類,我真的需要一些幫助。 請記住,如果你回答這個問題,我是新手。
我必須制作一個程序,它取特定列表中所有元素的平均值“l”。 這本身就很簡單; 問題是老師要我們在做平均值之前刪除列表中的任何空字符串。
因此,當我收到列表[1,2,3,'',4]
我希望函數忽略''
作為平均值,並且只取其他4 / len(l)的平均值。 誰能幫我這個?
也許是一個循環,不斷將列表中的某個位置與''
並從列表中刪除它們? 我試過了,但它不起作用。
您可以使用列表推導來刪除所有''
元素:
mylist = [1, 2, 3, '', 4]
mylist = [i for i in mylist if i != '']
然后,您可以通過將總和除以列表中元素的數量來計算平均值:
avg = sum(mylist)/len(mylist)
根據您的應用程序,您可能希望平均值為浮點數而不是int值。 如果是這種情況,請先將其中一個值轉換為float:
avg = float(sum(mylist))/len(mylist)
或者你可以使用python 3的部門:
from __future__ import division
avg = sum(mylist)/len(mylist)
你可以使用filter()
:
如果我們在Python 3中傳遞一個列表和一個iterator
, filter()
在Python 2中返回一個list
。正如@PhilH所建議的,您可以在Python 2中使用itertools.ifilter()
來獲取迭代器。
要在Python 3中獲取列表作為輸出,請使用list(filter(lambda x:x != '', lis))
In [29]: lis = [1, 2, 3, '', 4, 0]
In [30]: filter(lambda x:x != '', lis)
Out[30]: [1, 2, 3, 4, 0]
注意要過濾任何虛假值,您只需使用filter(None, ...)
:
>>> lis = [1, 2, 3, '', 4, 0]
>>> filter(None, lis)
[1, 2, 3, 4]
其他答案向您展示如何創建一個刪除了所需元素的新列表(這是在python中執行此操作的常用方法)。 但是,在某些情況下,您希望在列表中進行操作 - 這是一種在列表中操作的方法:
while True:
try:
mylist.remove('')
except ValueError:
break
雖然我認為可以說你可以通過切片分配和列表理解來做到這一點:
mylist[:] = [i for i in mylist if i != '']
並且,正如一些人提出了關於內存使用和生成器奇跡的問題:
mylist[:] = (i for i in mylist if i != '')
也有效。
itertools.ifilterfalse(lambda x: x=='', myList)
這使用迭代器,因此它不會創建列表的副本,並且應該在時間和內存方面更高效,使其對長列表更加健壯。
JonClements指出這意味着要分別跟蹤長度,以便顯示該過程:
def ave(anyOldIterator):
elementCount = 0
runningTotal = 0
for element in anyOldIterator:
runningTotal += element
elementCount += 1
return runningTotal/elementCount
甚至更好
def ave(anyOldIterator):
idx = None
runningTotal = 0
for idx,element in enumerate(anyOldIterator):
runningTotal += element
return runningTotal/(idx+1)
降低:
def ave(anyOldIterator):
pieces = reduce(lambda x,y: (y[0],x[1]+y[1]), enumerate(anyOldIterator))
return pieces[1]/(pieces[0]+1)
在平均范圍(0,1000)運行10000次的時間上給出列表理解時間為0.9s,減少版本為0.16s。 因此,在我們添加過濾之前,它已經快了5倍。
您可以使用:
alist = ['',1,2]
new_alist = filter(None, alist)
new_alist_2 = filter(bool, alist)
結果:
new_alist = [1,2]
new_alist_2 = [1,2]
mylist = [1, 2, 3, '', 4]
newlist = []
for i in mylist:
try:
newlist.append(int(i))
except ValueError:
pass
avg = sum(newlist)/len(newlist)
''相當於False。 如果我們過濾0個案例(因為0等於False),我們可以使用列表理解:
[x for x in a if x or x == 0]
或者,如果我們嚴格要過濾掉空字符串 :
[x for x in a if x != '']
這可能不是最快的方式。
編輯 ,添加了一些與其他解決方案相比較的替補結果(不是為了將自己與其他解決方案進行比較,但我對最快的方法感到好奇)
ragsagar>
6.81217217445
pistache>
1.0873541832
cerealy>
1.07090902328
Matt>
1.40736508369
Ashwini Chaudhary>
2.04662489891
Phil H (just the generator) >
0.935978889465
Phil H with list() >
3.58926296234
我使用timeit()快速制作了腳本,我使用了[0,1,2,0,3,4,'',5,8,0,'',4]
作為列表。 我跑了多次測試,結果沒有變化。
注意:我不是試圖使用速度作為標准將我的解決方案放在首位。 我知道OP沒有特別要求速度,但我很好奇,也許還有其他的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.