Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.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 根据字典键的值对其进行排序_Python_Sorting - Fatal编程技术网

Python 根据字典键的值对其进行排序

Python 根据字典键的值对其进行排序,python,sorting,Python,Sorting,我有这样一个python字典设置 mydict = { 'a1': ['g',6], 'a2': ['e',2], 'a3': ['h',3], 'a4': ['s',2], 'a5': ['j',9], 'a6': ['y',7] } 我需要编写一个函数,返回列表中已排序的键,这取决于排序所依据的列,例如,如果我们在mydict[key][1](升序)上排序 我应该会收到一份这样的名

我有这样一个python字典设置

mydict = { 'a1': ['g',6],
           'a2': ['e',2],
           'a3': ['h',3],
           'a4': ['s',2],
           'a5': ['j',9],
           'a6': ['y',7] }
我需要编写一个函数,返回列表中已排序的键,这取决于排序所依据的列,例如,如果我们在mydict[key][1](升序)上排序

我应该会收到一份这样的名单

['a2', 'a4', 'a3', 'a1', 'a6', 'a5']
除了在多个键中有相同值的列时,例如“a2”:[e',2]和“a4”:[s',2],它基本上是有效的。在本例中,它返回如下列表

['a4', 'a4', 'a3', 'a1', 'a6', 'a5']
这是我定义的函数

def itlist(table_dict,column_nb,order="A"):
    try:
        keys = table_dict.keys()
        values = [i[column_nb-1] for i in table_dict.values()]
        combo = zip(values,keys)
        valkeys = dict(combo)
        sortedCols = sorted(values) if order=="A" else sorted(values,reverse=True)
        sortedKeys = [valkeys[i] for i in sortedCols]
    except (KeyError, IndexError), e:
        pass
    return sortedKeys
如果我想对数字列进行排序,例如,它被称为like so

sortedkeysasc = itmethods.itlist(table,2)
有什么建议吗

保罗

在这里,您可以使用键调用对字典项(键值对)进行排序,该键调用可以建立项的总顺序

然后,您只需使用一个
map
和一个
lambda
筛选出所需的值,该值只需选择键即可。因此,您可以获得所需的密钥列表



编辑:有关更好的解决方案,请参阅。

尽管上面有多个有效答案,但对我来说,它们的细微变化/组合是最具吸引力的:

def itlist(table_dict, col, desc=False):
    return [key for (key,val) in
        sorted(
            table_dict.iteritems(),
            key=lambda x:x[1][col-1],
            reverese=desc,
            )
        ]

这不是更容易使用吗

sorted(d, key=lambda k: d[k][1])

(有了
d
作为字典)

你只需要使用排序函数的
kwarg我也有点偏爱
[k代表排序(…)中的(k,v)]
。天哪,非常感谢你!代码也比我的解决方案少得多!是的,迭代器的懒惰也是一个特别的优势。这个解决方案比我的好,遗憾的是我不能再投票了。)@ulidtko:lazines并不特别相关,因为排序之前,
sorted()
将生成整个列表。这相当于使用
a=d.keys();a、 排序(key=lambda k:d[k][1])
在这里,但是
sorted(d.keys(),…)
将创建列表的冗余副本。这很简单。是否可以进行反向操作,即根据键对字典值进行排序,并仅在一行中返回值列表。基本上避免了在这个
[v for(k,v)in sorted(d.iteritems(),key=lambda(k,v):v)]
@buffer中的列表理解:你不能做同样的事情,因为你不能查找给定值的键。我认为您的方法很好(可能使用
key=operator.itemgetter(1)
)。可供选择的方法是
map(d.get,sorted(d))
或不太明显的
itemgetter(*sorted(d))(d)
@buffer:我刚刚注意到,您的代码实际上是按值排序的,而不是按键排序的,正如您在文本中所说的那样。如果这是您实际需要的,那么根本不需要查看键,因此只需
sorted(d.itervalues())
即可。
[k for (k,v) in sorted(mydict.items(), key=lambda (k, v): v[1])]
sorted(d, key=lambda k: d[k][1])
>>> mydict = { 'a1': ['g',6],
...            'a2': ['e',2],
...            'a3': ['h',3],
...            'a4': ['s',2],
...            'a5': ['j',9],
...            'a6': ['y',7] }
>>> sorted(mydict, key=lambda k:mydict[k][1])
['a2', 'a4', 'a3', 'a1', 'a6', 'a5']
>>> sorted(mydict, key=lambda k:mydict[k][0])
['a2', 'a1', 'a3', 'a5', 'a4', 'a6']