Python:过滤字典

时间:2015-11-19 15:07:26

标签: python for-loop dictionary tuples

我有一个名为TempDict的庞大词典,其中包含其他几个词典。它看起来像这样:

2556 {'origin': u'HW', 'department': u'Intern', 'ticket-closed': False, 'prio-events': [(datetime.datetime(2015, 7, 27, 16, 30, 59, 547747, tzinfo=<LocalTimezone "CEST" 2:00:00>), u'Wichtig')], 'status-events': [(datetime.datetime(2015, 7, 27, 16, 30, 59, 547747, tzinfo=<LocalTimezone "CEST" 2:00:00>), u'new')]}
2557 {'origin': u'HW', 'department': u'Intern', 'ticket-closed': False, 'prio-events': [(datetime.datetime(2015, 7, 27, 16, 32, 37, 491657, tzinfo=<LocalTimezone "CEST" 2:00:00>), u'Wichtig')], 'status-events': [(datetime.datetime(2015, 7, 27, 16, 32, 37, 491657, tzinfo=<LocalTimezone "CEST" 2:00:00>), u'new')]}
2558 {'origin': u'HW', 'department': u'Intern', 'ticket-closed': False, 'prio-events': [(datetime.datetime(2015, 7, 27, 16, 33, 51, 29451, tzinfo=<LocalTimezone "CEST" 2:00:00>), u'Wichtig')], 'status-events': [(datetime.datetime(2015, 7, 27, 16, 33, 51, 29451, tzinfo=<LocalTimezone "CEST" 2:00:00>), u'new')]}
2559 {'origin': u'HW', 'department': u'Intern', 'ticket-closed': False, 'prio-events': [(datetime.datetime(2015, 7, 27, 16, 37, 39, 205416, tzinfo=<LocalTimezone "CEST" 2:00:00>), u'Wichtig')], 'status-events': [(datetime.datetime(2015, 7, 27, 16, 37, 39, 205416, tzinfo=<LocalTimezone "CEST" 2:00:00>), u'new')]}

正如您所看到的,有一个名为status-events的元组,它由一个日期时间对象和一个像&#39; new&#39;

之类的字符串组成。
(datetime.datetime(2015, 7, 27, 16, 37, 39, 205416, tzinfo=<LocalTimezone "CEST" 2:00:00>), u'new')

现在我要保存所有元素,其中第一个状态条目(它可以有多于一个的条目)来自2015年,在一个名为TicketDict1的新词典中

我已经尝试过这种方式,但TempDict1只是空着。

for i in self.TempDict:
        for j,k in self.TempDict[i]['status-events']:
            if j.isocalendar()[0] == '2015':
                self.ticketDict1[i] = self.TempDict[i]
                break

2 个答案:

答案 0 :(得分:3)

您可以尝试使用词典理解:

TicketDict1 = {key: value for key, value in TempDict.items() if 
               value["status-events"][0][0].year == 2015}

您可以使用.items()获取字典(key, value)对的列表,然后检查第一个条目value["status-events"][0][0]是否来自您要查找的.year

答案 1 :(得分:0)

并非所有字典的条目都是列表,因此当我尝试它时,Delgan解决方案引发了一个TypeError异常(也许我误解了一些东西)。

读取数据,我假设TempDict是一个字典列表,如果是这样,以下是使用列表理解的单行解决方案

TicketDict1 = [value for value in TempDict if isinstance(value["status-events"], list) and value["status-events"][0][0].year == 2015]

但是,我不喜欢重复代码(value["status-events"]写两次),所以我更喜欢以下更长的解决方案

TicketDict1 = []
for value in TempDict:
    entry = value["status-events"]
    if isinstance(entry, list) and entry[0][0].year == 2015:
        TicketDict1.append(value)