使用unicode按值排序列表中的字典

时间:2014-08-02 18:10:54

标签: python list sorting dictionary unicode

我正在练习我的美丽/网络抓取,并一直在查看选项数据。到目前为止,我将这些信息列在字典列表中。我正在尝试按Open(按降序排序)对输出进行排序,但因为它处于unicode状态,所以它不能正确排序。这是我的数据片段。

[{'Last': u'2.09', 'Vol': u'1', 'Open': u'200', 'Symbol': 'F', 'Strike': u'19.50', 'Ask': u'2.58', 'Date': '140816', 'Type': 'P', 'Bid': u'2.30', 'Change': u' 0.00'}, {'Last': u'1.96', 'Vol': u'1', 'Open': u'1', 'Symbol': 'F', 'Strike': u'19.50', 'Ask': u'2.60', 'Date': '140822', 'Type': 'P', 'Bid': u'2.30', 'Change': u' 0.00'}, {'Last': u'2.18', 'Vol': u'22', 'Open': u'1,045', 'Symbol': 'F', 'Strike': u'15.00', 'Ask': u'2.23', 'Date': '140816', 'Type': 'C', 'Bid': u'2.03', 'Change': u' 0.00'}]

到目前为止我要分类的是:

from operator import itemgetter
newlist = sorted(optionQuotes, key=itemgetter('Open'))

我如何在那里写东西转换为int然后再转回unicode。我尝试的一切都失败了,所以我一定会感激任何帮助。

3 个答案:

答案 0 :(得分:3)

排序使用字典比较,默认情况下,您使用它来比较字符串格式的数字。这就是为什么它没有按预期工作的原因。对于排序中使用的比较,您可以将Open的值转换为int

sorted(optionQuotes, key=lambda x: -int(x["Open"].replace(",", "")))

我刚用空字符串替换,,因为int函数无法转换非数字字符串。

另请注意-函数结果前的一元int运算符。由于您希望按降序排序,我们只是否定实际值。因此,1将成为-11045将成为-1045。现在,如果我们按升序排序,则-1045是所有值中的最小值,因此它将保持在初始位置,然后是200,最后是1。< / p>

修改:正如Padraic在评论中建议的那样,如果Open将包含十进制数,则可以使用float函数,而不是int。< / p>

答案 1 :(得分:1)

sorted(optionQuotes, key = lambda x : float(x.get("Open").replace(",","")), reverse = True)

如果您想对列表进行排序并避免创建另一个列表:

optionQuotes.sort(key = lambda x: float(x.get("Open").replace(",","")), reverse=True)

答案 2 :(得分:0)

您可以删除找到的非数字并转换为键功能中的int:

def conv(s):
    try:
        return int(''.join([e for e in s if e in u'0123456789']))
    except ValueError:
        return s    

print '\n'.join(map(str, sorted(LoD, key=lambda d: conv(d['Open']), reverse=True)))

打印:

{'Strike': u'15.00', 'Ask': u'2.23', 'Last': u'2.18', 'Vol': u'22', 'Type': 'C', 'Symbol': 'F', 'Open': u'1,045', 'Bid': u'2.03', 'Change': u' 0.00', 'Date': '140816'}
{'Strike': u'19.50', 'Ask': u'2.58', 'Last': u'2.09', 'Vol': u'1', 'Type': 'P', 'Symbol': 'F', 'Open': u'200', 'Bid': u'2.30', 'Change': u' 0.00', 'Date': '140816'}
{'Strike': u'19.50', 'Ask': u'2.60', 'Last': u'1.96', 'Vol': u'1', 'Type': 'P', 'Symbol': 'F', 'Open': u'1', 'Bid': u'2.30', 'Change': u' 0.00', 'Date': '140822'}

如果你想支持浮点数,例如在'Last'字段中,你可以使用正则表达式,这样你就可以支持像-1.23e-2这样的浮点数:

def convf(s):
    m=re.search(r'([-+]?[0-9,]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?)', s)
    if not m:
        return s
    ns=re.sub(r'[^\d\.e\-+]', '', m.group(1).lower() )   
    try:
        return float(ns)
    except ValueError:
        return s        
print '\n'.join(map(str, sorted(LoD, key=lambda d: convf(d['Last']))))

打印:

{'Strike': u'19.50', 'Ask': u'2.60', 'Last': u'1.96', 'Vol': u'1', 'Type': 'P', 'Symbol': 'F', 'Open': u'1', 'Bid': u'2.30', 'Change': u' 0.00', 'Date': '140822'}
{'Strike': u'19.50', 'Ask': u'2.58', 'Last': u'2.09', 'Vol': u'1', 'Type': 'P', 'Symbol': 'F', 'Open': u'200', 'Bid': u'2.30', 'Change': u' 0.00', 'Date': '140816'}
{'Strike': u'15.00', 'Ask': u'2.23', 'Last': u'2.18', 'Vol': u'22', 'Type': 'C', 'Symbol': 'F', 'Open': u'1,045', 'Bid': u'2.03', 'Change': u' 0.00', 'Date': '140816'}