在python中按值排序多个dict
我正在尝试用Python对多个字典进行降序排序在python中按值排序多个dict,python,sorting,dictionary,Python,Sorting,Dictionary,我正在尝试用Python对多个字典进行降序排序 highs = [] file_a = open("/home/victor/Documents/Python-3.5.1/W2_0@IAB.CSV") def func(): for line in file_a: from collections import OrderedDict s = {} (s['date'], s['open'], s['high'], s['low'], s[
highs = []
file_a = open("/home/victor/Documents/Python-3.5.1/W2_0@IAB.CSV")
def func():
for line in file_a:
from collections import OrderedDict
s = {}
(s['date'], s['open'], s['high'], s['low'], s['close'], s['volume'], s['openinterest'], s['totalVolume'], s['totalOpenInterest']) = line.split(',')
newlist = sorted(s.items(), key=lambda s: float(s[2]), reverse = True)
func()
file_a.close()
但是,每次运行时都会出现以下错误:
File "/home/victor/Documents/first project.py", line 8, in <lambda>
newlist = sorted(s.items(), key=lambda s: float(s[2]), reverse = True)
IndexError: tuple index out of range
文件“/home/victor/Documents/first project.py”,第8行,在
newlist=sorted(s.items(),key=lambda s:float(s[2]),reverse=True)
索引器错误:元组索引超出范围
我对Python非常陌生。如果有任何帮助,我们将不胜感激。由于您每次都会覆盖字典
s
,因此,除了文件中的最后一行之外,您实际上没有存储任何内容。您需要将该词典存储在列表中:
data = []
for line in file_a:
s = {}
(s['date'], s['open'], s['high'], s['low'], s['close'], s['volume'], s['openinterest'], s['totalVolume'], s['totalOpenInterest']) = line.split(',')
data.append(s)
然后,您可以使用以下方法对列表进行排序:
newlist = sorted(data, key=lambda x: -float(x['high']))
(注意,在本例中,我使用的是负值high
,而不是reverse=True
)
您也不应该每次在循环中导入
OrderedDict
您的代码存在的一个问题是,它会在整个文件中反复创建名为s
的dictionary对象,但在创建下一个对象之前不会对每个对象执行任何操作(最后一个除外,请参见下文)
错误消息是因为在创建并忽略所有这些字典后,在执行此操作的读取循环完成后,尝试对s.items()
中的值进行排序。这意味着s
将保留创建的最后一个字典(从文件的最后一行)。无论如何,s.items()
是字典的(键、值)对列表的副本,其中可能包含以下内容:
[('volume', '300000'), ('high', '110'), ('low', '90') ('totalOpenInterest', '4.56'),
('date', '01/01/16'), ('close', '101'), ('openinterest', '.99'), ('open', '100'),
('totalVolume', '1000000')]
由于此列表中的每一项中只有两个项—其中的每一项都被命名为lambda
函数的s
参数,这有点令人困惑—因此float(s[2])
在代码中引发一个索引错误
,因为2
大于这些值对的最高有效索引1
我认为下面的代码正确地完成了您要完成的任务。它首先存储在名为data
的临时列表中创建的每个s
字典,然后根据其键引用的每个字典中的一个值对其进行排序('high'
)
围绕这条线的三个问题:
newlist = sorted(s.items(), key=lambda s: float(s[2]), reverse = True)
首先,这在循环之外,这意味着s
只是文件的最后一行;前面所有行的数据都已被丢弃。其次,即使它拥有所有数据,分配给新变量newlist
也没有任何用处;您可能想附加到高位
或其他内容
但是,您看到的错误消息是因为
s.items
返回成对(两个元素元组)的列表:[(key1,value1),(key2,value2),(key3,value3),…]
。如果要按值排序,给定一个元组s
,即s[1]
。键是s[0]
<代码>s[2]不存在;这将是元组的第三个元素,但没有一个。items()
提供包含两个元素的tuple
对象。这样一个元组的最高索引是1
,而不是2
。如何根据值“high”对文本文件中的行进行排序?s
是一个带有字符串键的字典,如'date'
,'open'
,和'high'
,但是您试图使用传递给sorted()
调用的key
函数中的数值2
的键。您可能需要float(s['high'])
。我尝试过,但出现了以下错误:索引器错误:元组索引超出范围。您能否提供至少两行csv文件数据,以便我们能够重现您的问题?
newlist = sorted(s.items(), key=lambda s: float(s[2]), reverse = True)