2016-02-26 129 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