Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中按值排序多个dict_Python_Sorting_Dictionary - Fatal编程技术网

在python中按值排序多个dict

在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[

我正在尝试用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
文件“/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)