Python:过滤字典

Python:过滤字典,python,for-loop,dictionary,tuples,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-e

我得到了一本名为
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')]}
现在我想将所有元素保存在名为
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

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

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

您可以使用获取词典的配对列表
(键、值)
,然后检查第一个条目
值[“状态事件”][0][0]
是否来自您要查找的。

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

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

您可以使用获取词典的成对列表
(键、值)
,然后检查第一个条目
value[“status events”][0][0]
是否来自您要查找的条目。

并非词典的所有条目都是列表,因此解决方案在我尝试时会引发一个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)

并不是所有的字典条目都是列表,所以当我尝试它时,这个解决方案会引发一个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)


状态事件不是元组,而是元组列表。状态事件不是元组,而是元组列表。我认为还有一个嵌套级别<代码>值[“状态事件”][0][0]您不需要在
键、值
@kirbyfan64sos周围加括号,我想它可能更可读,但您是对的,没有括号可能更好,谢谢。好主意。。但对我来说还是不行。TempDict保持为空。@k.troy2012然后您的数据出现问题,因为我在本地测试了它,它工作正常。我认为还有一个嵌套级别<代码>值[“状态事件”][0][0]您不需要在
键、值
@kirbyfan64sos周围加括号,我想它可能更可读,但您是对的,没有括号可能更好,谢谢。好主意。。但对我来说还是不行。TempDict保持为空。@k.troy2012然后您的数据出现问题,因为我在本地测试了它,它工作正常。文件“/media/sf_Projects/Ticketauswertung/Converting.py”,第30行,在ConvertData entry=value[“status events”]TypeError:“int”对象没有“getitem”属性这意味着TempDict中的所有条目都不是字典。我不能对你的第一个问题发表评论,你能更好地解释一下TempDict的类型/结构吗?TempDict是一本由这些票据组成的字典。Delgan已经在上面为我发布了正确的解决方案。无论如何谢谢。文件“/media/sf_Projects/ticketaswertung/Converting.py”,ConvertData entry=value[“status events”]TypeError中的第30行:“int”对象没有属性“getitem”,这意味着TempDict中的所有条目都不是字典。我不能对你的第一个问题发表评论,你能更好地解释一下TempDict的类型/结构吗?TempDict是一本由这些票据组成的字典。Delgan已经在上面为我发布了正确的解决方案。无论如何,谢谢你。