我正在练习我的美丽/网络抓取,并一直在查看选项数据。到目前为止,我将这些信息列在字典列表中。我正在尝试按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。我尝试的一切都失败了,所以我一定会感激任何帮助。
答案 0 :(得分:3)
排序使用字典比较,默认情况下,您使用它来比较字符串格式的数字。这就是为什么它没有按预期工作的原因。对于排序中使用的比较,您可以将Open
的值转换为int
sorted(optionQuotes, key=lambda x: -int(x["Open"].replace(",", "")))
我刚用空字符串替换,
,因为int
函数无法转换非数字字符串。
另请注意-
函数结果前的一元int
运算符。由于您希望按降序排序,我们只是否定实际值。因此,1
将成为-1
,1045
将成为-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'}