【问题标题】:Python: Filtering a dictionaryPython:过滤字典
【发布时间】:2016-02-21 19:23:32
【问题描述】:

我有一本名为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 的元组,它由一个日期时间对象和一个类似“new”的字符串组成

(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

【问题讨论】:

  • status-events 不是一个元组,而是一个元组列表。

标签: python for-loop dictionary tuples


【解决方案1】:

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

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

【讨论】:

  • 我认为还有一层嵌套...value["status-events"][0][0]
  • key, value 周围不需要括号。
  • @kirbyfan64sos 我认为它可能更具可读性,但你是对的,这可能会更好,谢谢。
  • 好主意..但它仍然不适合我。 TempDict 保持为空。
  • @k.troy2012 那么您的数据有问题,因为我在本地对其进行了测试,并且效果很好。
【解决方案2】:

并非所有字典的条目都是列表,因此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)

【讨论】:

  • 文件 "/media/sf_Projects/Ticketauswertung/Converting.py",第 30 行,在 ConvertData entry = value["status-events"] TypeError: 'int' object has no attribute '获取项目'
  • 这意味着并非 TempDict 中的所有条目都是字典。我不能评论你的第一个问题,你能更好地解释一下 TempDict 的类型/结构吗?
  • TempDict 是包含这些票证的字典。
  • Delgan 已经在上面为我发布了正确的解决方案。无论如何,谢谢。
猜你喜欢
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
  • 1970-01-01
  • 2018-07-30
  • 2021-08-24
  • 2021-10-24
  • 2023-03-23
相关资源
最近更新 更多