我正在尝试按降序在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['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
我是Python的新手。任何帮助将不胜感激。
答案 0 :(得分:2)
你的代码有一个问题就是它遍历整个文件,反复创建一个名为s
的字典对象,但在创建下一个字典对象之前不对它们做任何事情(除了最后一个,见下文) )。
错误消息是因为在创建并忽略所有这些字典之后,尝试在完成此操作的读取循环之后对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')]
由于此列表的每个项目中只有两个内容 - 每个项目都有点令人困惑,也被命名为s
函数的lambda
参数 - 因此,代码中的float(s[2])
会引发IndexError
因为2
大于1
的最高有效索引,因此每个值对都是s
。
我认为以下代码正确地完成了您要完成的任务。它首先存储在名为data
的临时列表中创建的每个'high'
词典,然后按其键(def func(filename):
data = []
with open(filename) as file_a:
for line in file_a:
line = line.rstrip() # remove newline at end
s = {}
(s['date'], s['open'], s['high'], s['low'],
s['close'], s['volume'], s['openinterest'],
s['totalVolume'], s['totalOpenInterest']) = line.split(',')
data.append(s)
return sorted(data, key=lambda s: float(s['high']), reverse=True)
filename = "/home/victor/Documents/Python-3.5.1/W2_0@IAB.CSV"
sorted_dicts = func(filename)
for d in sorted_dicts:
print(d)
)引用的每个值中的一个值对其进行排序。 / p>
{{1}}
答案 1 :(得分:1)
围绕这一行的三个问题:
newlist = sorted(s.items(), key=lambda s: float(s[2]), reverse = True)
首先,这是在循环之外,这意味着s
只是文件的最后一行;所有以前的行数据都被丢弃了。其次,即使它拥有所有数据,分配给新变量newlist
也没有做任何有用的事情;你可能想要附加到highs
或其他东西。
然而,您看到的错误消息是因为s.items
返回对的列表(双元素元组):[(key1, value1), (key2, value2), (key3, value3),...]
。如果您希望按值排序,则给定单个元组s
,即s[1]
。关键是s[0]
。 s[2]
不存在;这将是元组的第三个元素,但没有一个元素。
答案 2 :(得分:0)
您实际上并没有在文件的最后一行存储任何内容,因为每次都会覆盖字典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
!