Python 使用unicode按值对列表中的词典进行排序

Python 使用unicode按值对列表中的词典进行排序,python,list,sorting,dictionary,unicode,Python,List,Sorting,Dictionary,Unicode,我正在练习我的beautifulsoup/web抓取,并且一直在查看选项数据。到目前为止,我在一系列词典中找到了这些信息。我试图按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':

我正在练习我的beautifulsoup/web抓取,并且一直在查看选项数据。到目前为止,我在一系列词典中找到了这些信息。我试图按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。我尝试过的一切都失败了,因此我非常感谢您的帮助。

默认情况下,排序使用字典比较,您使用它来比较字符串格式的数字。这就是为什么它没有像你期望的那样工作。对于排序中使用的比较,可以将
Open
的值转换为
int
,如下所示

sorted(optionQuotes, key=lambda x: -int(x["Open"].replace(",", "")))
我刚刚用空字符串替换了
,因为
int
函数将无法转换其中包含非数字的字符串

还要注意
int
函数结果之前的一元
-
运算符。因为您希望按降序排序,所以我们只是对实际值求反。因此,
1
将变成
-1
1045
将变成
-1045
。现在,如果我们按升序排序,
-1045
是所有值中最小的,因此它将保持在初始位置,然后是
200
,最后是
1


编辑:正如Padraic在评论中所建议的那样,如果
打开的
将有十进制数字,您可以使用
浮动
功能,而不是
int
排序默认情况下使用字典比较,您使用它来比较字符串格式的数字。这就是为什么它没有像你期望的那样工作。对于排序中使用的比较,可以将
Open
的值转换为
int
,如下所示

sorted(optionQuotes, key=lambda x: -int(x["Open"].replace(",", "")))
sorted(optionQuotes, key = lambda x : float(x.get("Open").replace(",","")), reverse = True)
我刚刚用空字符串替换了
,因为
int
函数将无法转换其中包含非数字的字符串

还要注意
int
函数结果之前的一元
-
运算符。因为您希望按降序排序,所以我们只是对实际值求反。因此,
1
将变成
-1
1045
将变成
-1045
。现在,如果我们按升序排序,
-1045
是所有值中最小的,因此它将保持在初始位置,然后是
200
,最后是
1

编辑:正如Padraic在评论中建议的那样,如果
打开的
将有十进制数,则可以使用
浮动
功能,而不是
int

sorted(optionQuotes, key = lambda x : float(x.get("Open").replace(",","")), reverse = True)
如果要对列表进行适当排序并避免创建另一个列表,请执行以下操作:

optionQuotes.sort(key = lambda x: float(x.get("Open").replace(",","")), reverse=True)
如果要对列表进行适当排序并避免创建另一个列表,请执行以下操作:

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

您可以删除在键函数中找到的非数字并将其转换为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'}
{'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'}
如果您想支持浮动,例如在
'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'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'}
{'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'}

您可以删除在键函数中找到的非数字并将其转换为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'}
{'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'}
如果您想支持浮动,例如在
'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'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'}
{'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'}

这将很棘手,因为当尝试进行
int
转换时,例如
u'1045'
将引发
ValueError
。不过,一般来说,请注意,
函数不会永久影响字典的内容,它只会创建一个新的值用于比较。这将是一个棘手的问题,因为当尝试进行
int
转换时,例如
u'1045'
会引发
ValueError
。不过,一般来说,请注意,
函数不会永久影响字典的内容,它只是创建了一个新的值用于比较。lambda x:x.get(“Open”)与
itemgetter(“Open”)
有什么不同?@johnrsharpe,除了不需要导入外,op的代码还能工作,它只需要被逆转。我不明白导入的意义是什么needed@PadraicCunningham我相信,他喜欢根据数值排序,但他一直坚持字典比较。@thefourtheye,啊,好吧,我错过了
lambda x:x.get(“Open”)与
itemgetter(“Open”)
有什么不同吗?@johnrsharpe,除了不需要导入外,op的代码还可以工作,只需将其反转即可。我不明白导入的意义是什么needed@PadraicCunningham我相信,他喜欢根据数值排序,但他坚持用字典进行比较。@thefourtheye,啊,好吧,我错过了
如果将其中一个打开值更改为
2.00
会发生什么?@PadraicCunningham它将是排序后的第二个最后一个元素。在将浮点字符串转换为整数时,必须使用
int(float())
int@PadraicCunningham你说得对,,但是我们不知道数据的性质,对吗?@padraiccnningham在那里,我在现在的答案中包含了一个关于这一点的注释:-)如果你将一个开放值更改为
2.00
会发生什么?@padraiccnningham它将是排序后的第二个最后一个元素。你必须使用
int(float())
将浮点数字符串转换为整数时,不能直接转换为整数int@PadraicCunningham你是对的,但我们不知道数据的性质,对吗?@PadraicCunningham,我现在在答案中加入了一条关于这一点的注释:-)