当只有两个键可用时,Python如何从字典中获取键值对的范围

时间:2018-08-06 05:20:30

标签: python json dictionary

下面有一个json格式的字典

public class MusicObjectTable
    {
        public List<IArtist> Artists;
        public List<IAlbum> Albums;
        public List<ITrack> Tracks;

        public MusicObjectTable()
        {
            this.Artists = new List<IArtist>();
            this.Albums = new List<IAlbum>();
            this.Tracks = new List<ITrack>();
        }

        public MusicObjectTable(List<IArtist> artists, List<IAlbum> albums, List<ITrack> tracks)
        {
            this.Artists = artists;
            this.Albums = albums;
            this.Tracks = tracks;
        }
    }
}

与此json一起,我分别在元组中有2个ids(823feb2,823efl2)。现在,我需要在新字典中获取键值对(id [as key]和message [as value])的范围。为此,我需要从第一个ID获取所有ID和消息,直到它与最后一个ID匹配为止(在所有ID和消息之间应插入新字典中。)位于这些ID之外的其余部分应忽略。 简而言之,预期结果应包含除键(8782)之外的所有键(823feb2,822,823efl2)

4 个答案:

答案 0 :(得分:0)

仅是字典理解

new_dict = {k:v for k, v in old_dict.items() if my_range[0] < k < my_range[1]}

答案 1 :(得分:0)

从所需的输出中看起来像:

print({i['id']:i['message'] for i in json['values']})

输出:

{'823feb2': 'Merge pull request #1160', '822': 'Merge pull request #1161', '823efl2': 'Merge pull request #1163'}

答案 2 :(得分:0)

您可以使用列表理解功能获得所需的输出-

dict_from_json = json.load(open('/path/to/json'))
>>>dict_from_json
{
    "values": [{
        "id": "823feb2",
        "message": "Merge pull request #1160",
        "parents": [{
            "id": "822",
            "displayId": "4e8a"
        },
        {
            "id": "8c6",
            "displayId": "8c6"
        }],
        "properties": {
            "jira-key": ["AN-736"]
        }
    },
    {
        "id": "822",
        "message": "Merge pull request #1161",
        "parents": [{
            "id": "823efl2",
            "displayId": "4e44a"
        },
        {
            "id": "8c236",
            "displayId": "8c2236"
        }],
        "properties": {
            "jira-key": ["AFN-726"]
        }
    },
    {
        "id": "823efl2",
        "message": "Merge pull request #1163",
        "parents": [{
            "id": "4e3t3r2d",
            "displayId": "4e28a"
        },
        {
            "id": "8cwfd6",
            "displayId": "8c4446"
        }],
        "properties": {
            "jira-key": ["AHN-7326"]
        }
    }]
}

ids = ('823feb2', '823efl2')

output = [{item['id']:item['message']} for item in dict_from_json['values'] if item['id'] in ids]

>>>output
[{'823feb2': 'Merge pull request #1160'},
 {'823efl2': 'Merge pull request #1163'}]

答案 3 :(得分:0)

假设您已经有一个dict

In [290]: def get_messages(data, start, end):
     ...:     ret = {}
     ...:     started = False
     ...:     for v in data['values']:
     ...:         if not started:
     ...:             if v['id'] != start:
     ...:                 continue
     ...:             else:
     ...:                 started = True
     ...:
     ...:         ret[v['id']] = v['message']
     ...:
     ...:         if v['id'] == end:
     ...:             break
     ...:
     ...:     return ret
     ...:

测试开始完成

In [291]: get_messages(data, '823feb2', '823elf2')
Out[291]:
{'822': 'Merge pull request #1161',
 '823efl2': 'Merge pull request #1163',
 '823feb2': 'Merge pull request #1160'}

第一至第二项

In [292]: get_messages(data, '823feb2', '822')
Out[292]: {'822': 'Merge pull request #1161', '823feb2': 'Merge pull request #1160'}

第二项到第三项

In [293]: get_messages(data, '822', '823efl2')
Out[293]: {'822': 'Merge pull request #1161', '823efl2': 'Merge pull request #1163'}

最后一项

In [294]: get_messages(data, '823efl2', '823efl2')
Out[294]: {'823efl2': 'Merge pull request #1163'}

startend点不存在

In [295]: get_messages(data, None, None)
Out[295]: {}