簡體   English   中英

從列表中刪除空字符串

[英]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)

浮點平均值(假設python 2)

根據您的應用程序,您可能希望平均值為浮點數而不是int值。 如果是這種情況,請先將其中一個值轉換為float:

avg = float(sum(mylist))/len(mylist)

或者你可以使用python 3的部門:

from __future__ import division
avg = sum(mylist)/len(mylist)

你可以使用filter()

如果我們在Python 3中傳遞一個列表和一個iteratorfilter()在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM