2017-03-15 36 views
0

假設你有以下列表:的Python:指定布爾值列表元素給予一個特定條件

import numpy as np 

mylist=[8.4468975, 
     8.52036, 
     9.3605785, 
     np.ma.core.MaskedConstant(), 
     np.ma.core.MaskedConstant()] 

# [8.4468975, 8.52036, 9.3605785, masked, masked]   

,你要分配給0masked所有值,並1所有其他人。你怎麼能正確地做到這一點?

我想這一點,但結果是一個空列表:

mylist=[1 for i,v in enumerate(mylist) if type(mylist[i]) is float] 

結果應該是數字(無真/假):

mylist=[1,1,1,0,0] 

編輯

我的原始列表中存在的masked值爲numpy.ma.core.MaskedConstant

回答

1

你可以試試這個:

mylist = [1 if isinstance(v, float) else 0 for i,v in enumerate(mylist)] 

或者,你可以這樣做:

mylist = [0 if isinstance(v, np.ma.core.MaskedConstant) else 1 for i,v in enumerate(mylist)] 

,所以你只設置爲0,一個特定的蔭罩式。

相關函數來檢查變量的類型是:https://docs.python.org/2/library/functions.html#isinstance

而且,你(正確)使用枚舉結構,您已經遍歷與變量v的值,所以沒必要對其進行訪問做mylist [i]。

+0

我實際上已經忘記了關於「masked」實例類型的重要內容。它們是'numpy.ma.core.MaskedConstant',而不是字符串。所以你的方法不能像現在這樣。 – FaCoffee

+0

無論如何,我的方法應該工作,因爲它不依賴字符串比較。 – FLab

+0

我得到的結果是'0'值列表。沒有其他的。我不明白爲什麼 – FaCoffee

2

像這樣:

mylist=[8.4468975, 
     8.52036, 
     9.3605785, 
     masked, 
     masked] 

mylist = [0 if type(x) is numpy.ma.core.MaskedConstant else 1 for x in mylist] 

另外請注意,您的列表理解mylist=[1 for i,v in enumerate(mylist) if type(mylist[i]) is float]並不完全做你的描述;至少不是在一般情況下。您正在將1分配給任何不是float的東西,這與'masked'的任何東西都不相同。

還要注意的是循環一樣[1 for i,v in enumerate(mylist) if type(mylist[i]) is float]當你(虛假不過,見進一步下跌)不使用v所以你可以改寫爲[1 for i,_ in enumerate(mylist) if type(mylist[i]) is float]。注意下劃線。它用來暗示你將傾銷enumerate()返回的元組的第二項。

最後,我說錯了,因爲在你的列表中,理解mylist[i]可以用v代替。如此正確地完成它將被寫爲:[1 for v in mylist if type(v) is float]。但正如我所說,這與你想要的略有不同。

+0

嗯,是的,它是有缺陷的。我不應該在清晨編碼... – FaCoffee

+0

我實際上已經忘記了關於'masked'實例類型的重要事情。它們是'numpy.ma.core.MaskedConstant',而不是字符串。所以你的方法不能像現在這樣。 – FaCoffee

+1

@ CF84現在您的*解決方法*更有意義。我會閱讀這些內容並編輯我的答案 –

2

您可以使用int()投你的布爾爲整數:

[int(isinstance(x,float)) for x in mylist] 

注意這個工程,因爲numpy.ma.core.MaskedConstant()不是float

1

可以使用map功能在這裏:

>>> list(map(lambda x : 0 if isinstance(x,np.ma.core.MaskedConstant) else 1 , mylist)) 

[1,1,1,0,0] 
1

你沒有看到這個答案,往往因此,我給它,儘管其他的答案是令人滿意的。定義一個函數f

def f(x): 
    if isinstance(x, np.ma.core.MaskedConstant): 
     return 0 
    else: 
     return 1 

現在做列表理解

mylist = [f(x) for x in mylist] 
+0

謝謝,這真的很有幫助,因爲它將事物置於透視之中,並讓我想起功能的存在。然而,鑑於我正在處理的冗長代碼,我發現它更適合遵循列表理解方法。 – FaCoffee

+0

@ CF84這是列表理解方法。 – Elmex80s

相關問題