-1

这是我的字典列表:

ar = [{'employee_id': 20,
  'holiday_status_id': 2,
  'id': 2,
  'number_of_days': -1.0,
  'type': u'remove'},
 {'employee_id': 20,
  'holiday_status_id': 2,
  'id': 24,
  'number_of_days': 2.5,
  'type': u'add'},
 {'employee_id': 6,
  'holiday_status_id': 2,
  'id': 1,
  'number_of_days': -2.0,
  'type': u'remove'},
 {'employee_id': 8,
  'holiday_status_id': 2,
  'id': 25,
  'number_of_days': 6.0,
  'type': u'add'},
 {'employee_id': 7,
  'holiday_status_id': 2,
  'id': 22,
  'number_of_days': 6.0,
  'type': u'add'},
 {'employee_id': 9,
  'holiday_status_id': 2,
  'id': 26,
  'number_of_days': 6.0,
  'type': u'add'},
 {'employee_id': 9,
  'holiday_status_id': 2,
  'id': 76,
  'number_of_days': -1.0,
  'type': u'remove'},
 {'employee_id': 21,
  'holiday_status_id': 2,
  'id': 23,
  'number_of_days': 6.0,
  'type': u'add'},
 {'employee_id': 20,
  'holiday_status_id': 2,
  'id': 2,
  'number_of_days': -1.0,
  'type': u'remove'},
 {'employee_id': 20,
  'holiday_status_id': 2,
  'id': 24,
  'number_of_days': 2.5,
  'type': u'add'},
 {'employee_id': 9,
  'holiday_status_id': 2,
  'id': 26,
  'number_of_days': 6.0,
  'type': u'add'},
 {'employee_id': 9,
  'holiday_status_id': 2,
  'id': 76,
  'number_of_days': -1.0,
  'type': u'remove'}]

当我给出时employee_id = 20,需要获取相关的词典,并且id结果应该有所不同。

4

4 回答 4

3

列表推导为您提供所有匹配的记录:

[d for d in ar if d['employee_id'] == 20]

演示:

>>> [d for d in ar if d['employee_id'] == 20]
[{'type': u'remove', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': -1.0, 'id': 2}, {'type': u'add', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': 2.5, 'id': 24}, {'type': u'remove', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': -1.0, 'id': 2}, {'type': u'add', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': 2.5, 'id': 24}]

那是 4 条匹配记录,ID 为 2、24、2 和 24(看来您将示例翻了一番)。

如果您需要独特的条目,那么您需要跟踪您已经看到的内容;aset可以为您做到这一点:

seen = set()
entries = [d for d in ar if d['employee_id'] == 20 and d['id'] not in seen and not seen.add(d['id'])]

这会检查正确的员工 id,检查以前没有见过的记录 id,并将未见过的 id 添加到集合中。

现在只找到两个条目:

>>> seen = set()
>>> [d for d in ar if d['employee_id'] == 20 and d['id'] not in seen and not seen.add(d['id'])]
[{'type': u'remove', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': -1.0, 'id': 2}, {'type': u'add', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': 2.5, 'id': 24}]

请注意,每次搜索时都会遍历整个数据集。您最好创建一个永久字典:

from collections import defaultdict

by_employee_id = defaultdict(list)
seen = set()
for entry in ar:
    if entry['id'] not in seen:
        by_employee_id[entry['employee_id']].append(entry)
        seen.add(entry['id'])

这将构建一个字典,将员工 ID 映射到唯一记录列表。现在查询这是一个廉价的一步查找:

by_employee_id[20]

演示:

>>> from collections import defaultdict
>>> by_employee_id = defaultdict(list)
>>> seen = set()
>>> for entry in ar:
...     if entry['id'] not in seen:
...         by_employee_id[entry['employee_id']].append(entry)
...         seen.add(entry['id'])
... 
>>> by_employee_id[20]
[{'type': u'remove', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': -1.0, 'id': 2}, {'type': u'add', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': 2.5, 'id': 24}]
>>> by_employee_id[9]
[{'type': u'add', 'holiday_status_id': 2, 'employee_id': 9, 'number_of_days': 6.0, 'id': 26}, {'type': u'remove', 'holiday_status_id': 2, 'employee_id': 9, 'number_of_days': -1.0, 'id': 76}]
于 2013-10-24T11:54:23.573 回答
1

使用集合和生成器函数:

def solve(lis, employee_id):
    seen = set()
    for item in lis:
        if item['employee_id'] == employee_id and item['id'] not in seen:
            yield item
            seen.add(item['id'])

print list(solve(ar, 20))

输出:

[{'type': u'remove', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': -1.0, 'id': 2},
 {'type': u'add', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': 2.5, 'id': 24
于 2013-10-24T12:01:11.573 回答
1

您可以使用列表理解获取具有employee_id20 个这样的字典

print [myDict for myDict in ar if myDict["employee_id"] == 20]

输出

[{'type': u'remove', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': -1.0, 'id': 2},
 {'type': u'add', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': 2.5, 'id': 24},
 {'type': u'remove', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': -1.0, 'id': 2},
 {'type': u'add', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': 2.5, 'id': 24}]

编辑:根据 id 获取唯一元素

result = dict()
for d in [myDict for myDict in ar if myDict["employee_id"] == 20]:
    if d["id"] not in result:
        result[d["id"]] = d
print [value for key, value in result.items()]

输出

[{'type': u'add', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': 2.5, 'id': 24},
 {'type': u'remove', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': -1.0, 'id': 2}]
于 2013-10-24T11:54:39.703 回答
0

首先,为什么要使用列表?只需为所有员工准备一本字典,这里:

from collections import defaultdict
employees = defaultdict(list)
for employee in ar:
    employees[employee['employee_id']].append(employee)

现在您只需要获得您想要的:

>>> employees[20]
[{'type': u'remove', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': -1.0, 'id': 2}, {'type': u'add', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': 2.5, 'id': 24}, {'type': u'remove', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': -1.0, 'id': 2}, {'type': u'add', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': 2.5, 'id': 24}]

如果对于一些奇怪的阅读,您需要让每个员工在列表中成为他自己的字典,那么您可以这样做:

>>> [d for d in ar if d['employee_id'] == 20]
[{'type': u'remove', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': -1.0, 'id': 2}, {'type': u'add', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': 2.5, 'id': 24}, {'type': u'remove', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': -1.0, 'id': 2}, {'type': u'add', 'holiday_status_id': 2, 'employee_id': 20, 'number_of_days': 2.5, 'id': 24}]

如果你多次做这种动作,最好把它做成一个字典来提高性能,迭代一个列表并不是一件容易的事。

于 2013-10-24T11:53:30.473 回答