2016-02-26 126 views
0

基本上我想從這個列中提取價格值,但是如果我使用索引[0]它會在第11行中帶來索引[0]錯誤並且價格關鍵字也存在問題不會在這一行中退出。Python熊貓從列表中提取字典的值

ex 
0 {u'availableToBack': [{u 'price' : 1.02, u 'size' : 2.15}], u 'availableToLay' : [], u 'tradedVolume' : []} 
1 {u'availableToBack': [{u'price': 6.8, u'size':... 
2 {u'availableToBack': [{u'price': 8.2, u'size':... 
3 {u'availableToBack': [{u'price': 9.6, u'size':... 
10 {u'availableToBack': [{u'price': 70.0, u'size'... 
11 {u'availableToBack': [], u'availableToLay': []... 
12 {u'availableToBack': [], u'availableToLay': []... 

我使用這樣的

table['price'] = table['ex']['availableToBack'][0].apply(lambda x: x.get('price')) 

你能幫助我如何去解決它,好嗎?

JSON看起來是這樣的:

u 'runners' : [{ 
      u 'status' : u 'ACTIVE', 
      u 'handicap' : 0.0, 
      u 'selectionId' : 10861647, 
      u 'totalMatched' : 0.0, 
      u 'adjustmentFactor' : 16.631, 
      u 'ex' : { 
       u 'availableToBack' : [{ 
         u 'price' : 1.02, 
         u 'size' : 2.15 
        } 
       ], 
       u 'availableToLay' : [], 
       u 'tradedVolume' : [] 
      } 
     }, { 
      u 'status' : u 'ACTIVE', 
      u 'handicap' : 0.0, 
      u 'selectionId' : 10861648, 
      u 'totalMatched' : 0.0, 
      u 'adjustmentFactor' : 13.237, 
      u 'ex' : { 
       u 'availableToBack' : [{ 
         u 'price' : 1.01, 
         u 'size' : 7.11 
        } 
       ], 
       u 'availableToLay' : [], 
       u 'tradedVolume' : [] 
      } 
     }, 
+1

你可以發表你的JSON?我不明白':'0之後 – dnit13

+0

我已經加入JSON –

回答

0
10 {u'availableToBack': [{u'price': 70.0, u'size'... 
11 {u'availableToBack': [], u'availableToLay': []... 

我剛纔看到您的availableToBack項包含一個空列表。如果列表值爲空,則放入一個測試,將其設置爲[dict()]。這將允許x.get('price', 0)正常工作。然後,您將能夠在代碼的其餘部分將「價格」的值處理爲0。

然後您不必測試'無'。

x.get('price')沒有指定「默認」值,因此它返回「無」。設置一個默認值(如x.get('price', 0))這樣你應該能夠以0的價格執行操作。

Python dictionary get() Method

說明

的get()方法返回給定鍵的值。如果密鑰不是 可用,則返回默認值無。語法

以下爲get()方法的語法 -

dict.get(鍵,默認爲無)

參數

key -- This is the Key to be searched in the dictionary. 

default -- This is the Value to be returned in case key does not exist. 

返回值

該方法返回給定鍵的值。如果密鑰不可用, 則返回默認值None。

0

我不認爲Python有一個安全的內置方法用於從列表中獲取值而不觸發IndexError,但寫起來很容易。 (This answer有更多的細節。)

如果我理解你的意圖正確,這可能會幫助你。 (請注意,這隻能滿足獲取列表項安全問題,你可能需要使用.get爲您檢索更多的安全每個字典值。)

def safeget(seq, index, default=None): 
    try: 
     return seq[index] 
    except IndexError: 
     return default 

for table in runners: 
    price = safeget(table['ex']['availableToBack'], 0, default={}).get('price') 
    print price 

我測試了針對這種結構,具有一第二個對象中的u'availableToBack的空列表。

runners = [ 
    { 
     u'status' : u'ACTIVE', 
     u'handicap' : 0.0, 
     u'selectionId' : 10861647, 
     u'totalMatched' : 0.0, 
     u'adjustmentFactor' : 16.631, 
     u'ex' : { 
      u'availableToBack' : [ 
        {u'price' : 1.02, u'size' : 2.15}, 
       ], 
      u'availableToLay' : [], 
      u'tradedVolume' : [] 
      } 
    }, { 
     u'status' : u'ACTIVE', 
     u'handicap' : 0.0, 
     u'selectionId' : 10861648, 
     u'totalMatched' : 0.0, 
     u'adjustmentFactor' : 13.237, 
     u'ex' : { 
      u'availableToBack' : [ 
       ## this one is MISSING a price 
      ], 
      u'availableToLay' : [], 
      u'tradedVolume' : [] 
     } 
    } 
] 
+0

我覺得他是用的字典()與鍵「價格」我覺得現在的問題是,沒有默認值,返回None的值類型。 – sabbahillel

+0

我認爲問題在於他的'availableToBack'是一個有時可能是空的數組,所以他的'[0]'索引有時會引發一個IndexError。 (他的第一個例子的第11行有一個空數組。) – zekel

+0

現在我明白了。你是對的。 – sabbahillel

0

您可以使用三元運算符。一個空列表的計算結果爲false。

table['price'] = (table['ex']['availableToBack'][0].get('price') 
        if table['ex']['availableToBack'] 
        else None) 
0

我找到了一個解決方案,並決定發佈它。基本上也許我沒有解釋清楚,但問題是在列表中有任何不一致之處。

table['availableToBack.price'] = table['ex'].apply(lambda x: x['availableToBack'][0].get('price') if (len(x['availableToBack']) != 0) else None) 
+0

你也可以做一個列表理解不是施加/ lambda.' [XX [ 'availableToBack'] [0]獲得( '價格')爲表[ 'EX' XX]如果len(XX [ 'availableToBack'] )否則無]' – zekel