繁体   English   中英

如何按值对字典列表进行排序

[英]How to sort list of dictionaries by value

dictionary[pattern_key] = {"key": index_key, "document": index_source, "startPos":index_start, "endPos": index_end}

这是我的字典清单的一部分

{
'AGACAATCTC': {'startPos': '174', 'document': 'source-document01012.txt', 'endPos': '183', 'key': 'AGACAATCTC'}, 
'GGTCAGACAA': {'startPos': '18', 'document': 'source-document01012.txt', 'endPos': '27', 'key': 'GGTCAGACAA'}, 
'TAGATGAAGT': {'startPos': '102', 'document': 'source-document01012.txt', 'endPos': '111', 'key': 'TAGATGAAGT'}
}

如何按文档然后按startPos排序

我尝试过这样的事情,但不起作用

sorted_dict = sorted(dictionary, key=itemgetter(pattern_key[document]))

script.py

#!/usr/bin/env python
import sys

dictionary = {};

for pattern in sys.stdin:

    if "," in pattern:
        pattern_key, pattern_source, pattern_start, pattern_end = pattern.strip().split(",")
        index_file =  open('index.txt', 'r')

        for line in index_file:
            if "," in line:
                index_key, index_source, index_start, index_end = line.strip().split(",")
                if pattern_key == index_key:
                    dictionary[pattern_key] = {"document": index_source, "startPos":index_start, "endPos": index_end}

sorted(dictionary.items(), key = lambda x: (x[1]['document'], int(x[1]['startPos'])))

for k, v in dictionary.items():
    print (k, '-->', v)

您可以在内部字典中获得条目作为sorted键:

sorted(dictionary.items(), key = lambda x: (x[1]['document'], int(x[1]['startPos'])))

元组键将首先按第0个元素排序,然后按1st排序,依此类推。

请注意,这会生成一个元组列表,其中每个元组都是(str, dict)

编辑:
在您的上下文中,正确的实现如下:

sorted_values = sorted(dictionary.items(), key = lambda x: (x[1]['document'], int(x[1]['startPos'])))

for k, v in sorted_values:
    print (k, '-->', v)

根据所需的条件进行排序,然后从排序列表中创建一个新的OrderedDict ,因为dict无法OrderedDict性质保留排序:

>>> from collections import OrderedDict
>>>
>>> d = {'AGACAATCTC': {'endPos': '183', 'document': 'source-document01010.txt', 'key': 'AGACAATCTC', 'startPos': '174'}, 'GGTCAGACAA': {'endPos': '27', 'document': 'source-document01010.txt', 'key': 'GGTCAGACAA', 'startPos': '18'}, 'TAGATGAAGT': {'endPos': '111', 'document': 'source-document01011.txt', 'key': 'TAGATGAAGT', 'startPos': '102'}}
>>> 
>>> d_ordered = OrderedDict(sorted(d.items(), key=lambda t:(t[1]['document'], int(t[1]['startPos']))))
>>> 
>>> d_ordered
OrderedDict([('GGTCAGACAA', {'endPos': '27', 'document': 'source-document01010.txt', 'key': 'GGTCAGACAA', 'startPos': '18'}), ('AGACAATCTC', {'endPos': '183', 'document': 'source-document01010.txt', 'key': 'AGACAATCTC', 'startPos': '174'}), ('TAGATGAAGT', {'endPos': '111', 'document': 'source-document01011.txt', 'key': 'TAGATGAAGT', 'startPos': '102'})])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM