按值对python中的多个dicts进行排序

时间:2016-04-24 06:27:36

标签: 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['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的新手。任何帮助将不胜感激。

3 个答案:

答案 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