检查嵌套字典内的成员资格

2023-12-01

这是此问题的后续问题:

Python DictReader - 跳过缺少列的行?

事实证明我很愚蠢,并且使用了错误的 ID 字段。

顺便说一句,我在这里使用的是 Python 3.x。

我有一个员工字典,由字符串“directory_id”索引。每个值都是一个包含员工属性(电话号码、姓氏等)的嵌套字典。其中一个值是辅助 ID,称为“internal_id”,另一个值是其经理,称为“manager_internal_id”。 “internal_id”字段是非强制字段,并非每个员工都有一个字段。

{'6443410501': {'manager_internal_id': '989634', 'givenName': 'Mary', 'phoneNumber': '+65 3434 3434', 'sn': 'Jones', 'internal_id': '434214'}
'8117062158': {'manager_internal_id': '180682', 'givenName': 'John', 'phoneNumber': '+65 3434 3434', 'sn': 'Ashmore', 'internal_id': ''}
'9227629067': {'manager_internal_id': '347394', 'givenName': 'Wright', 'phoneNumber': '+65 3434 3434', 'sn': 'Earl', 'internal_id': '257839'}
'1724696976': {'manager_internal_id': '907239', 'givenName': 'Jane', 'phoneNumber': '+65 3434 3434', 'sn': 'Bronte', 'internal_id': '629067'}

}

(我对这些字段进行了一些简化,既是为了使其更易于阅读,也是出于隐私/合规性原因)。

这里的问题是,我们通过每个员工的 Directory_id 为他们建立索引(键),但是当我们查找他们的经理时,我们需要通过他们的“internal_id”来查找经理。

之前,当我们的字典使用internal_id作为键时,employee.keys()是一个internal_id列表,我对此使用了成员资格检查。现在,我的 if 语句的最后一部分将不起作用,因为internal_ids 是字典值的一部分,而不是键本身。

def lookup_supervisor(manager_internal_id, employees):
    if manager_internal_id is not None and manager_internal_id != "" and manager_internal_id in employees.keys():
        return (employees[manager_internal_id]['mail'], employees[manager_internal_id]['givenName'], employees[manager_internal_id]['sn'])
    else:
        return ('Supervisor Not Found', 'Supervisor Not Found', 'Supervisor Not Found')

所以第一个问题是,如何修复 if 语句来检查 manager_internal_id 是否存在于字典的internal_ids 列表中?

我尝试用employee.values() 替换employee.keys(),但没有成功。另外,我希望有一些更有效的方法,不确定是否有办法获取值的子集,特别是员工[directory_id]['internal_id']的所有条目。

希望有一些 Python 风格的方法可以做到这一点,而无需使用大量嵌套的 for/if 循环。

我的第二个问题是,如何干净地返回所需的员工属性(邮件、名字、姓氏等)。我的 for 循环遍历每个员工,并调用lookup_supervisor。我在这里感觉有点愚蠢/难住了。

def tidy_data(employees):
    for directory_id, data in employees.items():
        # We really shouldnt' be passing employees back and forth like this - hmm, classes?
        data['SupervisorEmail'], data['SupervisorFirstName'], data['SupervisorSurname'] = lookup_supervisor(data['manager_internal_id'], employees)

我应该重新设计我的数据结构吗?或者还有别的办法吗?

EDIT:我稍微调整了代码,如下所示:

class Employees:

    def import_gd_dump(self, input_file="test.csv"):
        gd_extract = csv.DictReader(open(input_file), dialect='excel')
        self.employees = {row['directory_id']:row for row in gd_extract}

    def write_gd_formatted(self, output_file="gd_formatted.csv"):
        gd_output_fieldnames = ('internal_id', 'mail', 'givenName', 'sn', 'dbcostcenter', 'directory_id', 'manager_internal_id', 'PHFull', 'PHFull_message', 'SupervisorEmail', 'SupervisorFirstName', 'SupervisorSurname')
        try:
            gd_formatted = csv.DictWriter(open(output_file, 'w', newline=''), fieldnames=gd_output_fieldnames, extrasaction='ignore', dialect='excel')
        except IOError:
            print('Unable to open file, IO error (Is it locked?)')
            sys.exit(1)

        headers = {n:n for n in gd_output_fieldnames}
        gd_formatted.writerow(headers)
        for internal_id, data in self.employees.items():
            gd_formatted.writerow(data)

    def tidy_data(self):
        for directory_id, data in self.employees.items():
            data['PHFull'], data['PHFull_message'] = self.clean_phone_number(data['telephoneNumber'])
            data['SupervisorEmail'], data['SupervisorFirstName'], data['SupervisorSurname'] = self.lookup_supervisor(data['manager_internal_id'])

    def clean_phone_number(self, original_telephone_number):
        standard_format = re.compile(r'^\+(?P<intl_prefix>\d{2})\((?P<area_code>\d)\)(?P<local_first_half>\d{4})-(?P<local_second_half>\d{4})')
        extra_zero = re.compile(r'^\+(?P<intl_prefix>\d{2})\(0(?P<area_code>\d)\)(?P<local_first_half>\d{4})-(?P<local_second_half>\d{4})')
        missing_hyphen = re.compile(r'^\+(?P<intl_prefix>\d{2})\(0(?P<area_code>\d)\)(?P<local_first_half>\d{4})(?P<local_second_half>\d{4})')
        if standard_format.search(original_telephone_number):
            result = standard_format.search(original_telephone_number)
            return '0' + result.group('area_code') + result.group('local_first_half') + result.group('local_second_half'), ''
        elif extra_zero.search(original_telephone_number):
            result = extra_zero.search(original_telephone_number)
            return '0' + result.group('area_code') + result.group('local_first_half') + result.group('local_second_half'), 'Extra zero in area code - ask user to remediate. '
        elif missing_hyphen.search(original_telephone_number):
            result = missing_hyphen.search(original_telephone_number)
            return '0' + result.group('area_code') + result.group('local_first_half') + result.group('local_second_half'), 'Missing hyphen in local component - ask user to remediate. '
        else:
            return '', "Number didn't match format. Original text is: " + original_telephone_number    

    def lookup_supervisor(self, manager_internal_id):
        if manager_internal_id is not None and manager_internal_id != "":# and manager_internal_id in self.employees.values():
            return (employees[manager_internal_id]['mail'], employees[manager_internal_id]['givenName'], employees[manager_internal_id]['sn'])
        else:
            return ('Supervisor Not Found', 'Supervisor Not Found', 'Supervisor Not Found')

if __name__ == '__main__':
    our_employees = Employees()
    our_employees.import_gd_dump('test.csv')
    our_employees.tidy_data()
    our_employees.write_gd_formatted()

我猜(1)。我正在寻找一种更好的方法来构造/存储 Employee/Employees,并且(2)我特别遇到了lookup_supervisor() 的问题。\

我应该创建一个 Employee 类,并将其嵌套在Employees 中吗?

我是否应该用 tidy_data() 做我正在做的事情,并在 dict 项目的 for 循环上调用 clean_phone_number() 和 Lookup_supervisor() ?呃。confused.


您可能需要进行一些迭代才能获取数据。我假设您不想要一个可能会过时的额外字典,因此尝试存储内部 id 上键入的所有内容是不值得的。

试穿一下尺码:

def lookup_supervisor(manager_internal_id, employees):
    if manager_internal_id is not None and manager_internal_id != "":
        manager_dir_ids = [dir_id for dir_id in employees if employees[dir_id].get('internal_id') == manager_internal_id]
        assert(len(manager_dir_ids) <= 1)
        if len(manager_dir_ids) == 1:
            return manager_dir_ids[0]
    return None

def tidy_data(employees):
    for emp_data in employees.values():
        manager_dir_id = lookup_supervisor(emp_data.get('manager_internal_id'), employees)
        for (field, sup_key) in [('Email', 'mail'), ('FirstName', 'givenName'), ('Surname', 'sn')]:
            emp_data['Supervisor'+field] = (employees[manager_dir_id][sup_key] if manager_dir_id is not None else 'Supervisor Not Found')

你说得对,一堂课就是通过考试的答案employees大约。事实上,我建议不要将“主管”键存储在员工字典中,并建议在需要时随时更新主管字典,也许可以使用get_supervisor_data method.

除了我已经提到的更改和一些调整之外,您的新 OO 版本看起来都很合理clean_phone_number.

def clean_phone_number(self, original_telephone_number):
    phone_re = re.compile(r'^\+(?P<intl_prefix>\d{2})\((?P<extra_zero>0?)(?P<area_code>\d)\)(?P<local_first_half>\d{4})(?P<hyph>-?)(?P<local_second_half>\d{4})')
    result = phone_re.search(original_telephone_number)
    if result is None:
        return '', "Number didn't match format. Original text is: " + original_telephone_number
    msg = ''
    if result.group('extra_zero'):
        msg += 'Extra zero in area code - ask user to remediate. '
    if result.group('hyph'):    # Note: can have both errors at once
        msg += 'Missing hyphen in local component - ask user to remediate. '
    return '0' + result.group('area_code') + result.group('local_first_half') + result.group('local_second_half'), msg

您绝对可以为每个员工制作一个单独的对象,但是看看您如何使用数据以及从中需要什么,我猜它不会有那么多回报。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查嵌套字典内的成员资格 的相关文章

随机推荐

  • 如何从 Prolog 中保留函数的第一个结果?

    我需要编写一个自定义函数 该函数将被其他固定函数多次调用 在此函数中 在第一次调用时 它将返回文件的总行数 该函数的第二次调用时间 forward 将返回该文件的小部分中的行数 我的问题是如何保留第一个返回的结果 文件的总行数 并将其用于函
  • UpdatePanel异步回发后的Javascript事件订阅

    我在 asp net 页面上异步回发后遇到 jquery 事件处理程序问题 我读这个话题 这是一个很好的解决方案 但我需要一个单独的函数 所以我正在使用jquery 屏蔽插件 我现在的js代码是
  • 检查表的时间重叠?

    我有一个包含以下字段的 MySQL 表 name 开始时间 endtime starttime and endtime是 MySQLTIME字段 不DATETIME 我需要一种方法来定期 扫描 表以查看表内的时间范围是否有重叠 如果有一个事
  • pip install mysqlclient 在 Ubuntu 上使用 docker 上的 python 2.7 失败

    当我运行下面的 docker 文件代码时 RUN apt get update apt get install y no install recommends ca certificates vim git python python pi
  • 在 pandas/matplotlib 中格式化时间序列 x 轴

    我想显示每个月份的缩写 以及年份的缩写 我很接近 我目前遇到的问题是年份不正确 我发现这是 numpy datetime64 日期时间索引采用这种格式 和使用 1970 纪元的 python datetime 之间的问题 图表上显示的两年应
  • 显示随机字符串

    我试图在每次按下 strings xml 中定义的一组字符串中的按钮时显示一个随机字符串 这是字符串 ID 的示例
  • linkedHashSet 中的有序插入,有什么高性能的方法吗?

    所以我有一个 LinkedHashSet 其值为 a1 a2 b c1 c2 我想用 x 替换 b 使得 x 的顺序应与 b 的顺序相同 一种明显的方法是 private LinkedHashSet
  • JavaScript Google Maps API 如何将位置纬度/经度存储到全局变量

    我是 JavaScript 新手 希望实现 Google 提供的代码 以便在您的位置放置标记 但是 我想获取位置数据并在 getCurrentPosition 块之外使用它 我的第一遍是实例化一个对象 其中纬度和经度作为块外部的属性 并将其
  • 在 Canvas 中使用 arc() 方法添加多余的线条

  • 是否可以将处理(java 3d)中的窗口附加到像面板一样的摆动单元中?

    我想将另一个窗口附加到现有的窗口中JFrame or JComponent或者什么 有什么办法可以做到吗 编辑 不 当我的意思是正如标题所说 攻击a加工 显示窗口 处理基本上是在 java 中使用 3d 进行操作并可视化 3d 窗口 每当运
  • 如何使用 JavaScript 获取整个文档的高度?

    有些文档我无法获取文档的高度 将某些内容绝对放置在最底部 此外 填充底部似乎在这些页面上没有任何作用 但在高度将返回的页面上起作用 相关案例 http fandango com http paperbackswap com 方丹戈jQuer
  • C# 使用 SMO 以编程方式创建数据库

    我正在尝试创建数据库 但创建后无法连接到它 服务器是Microsoft SQL Server 2008并使用 Net 4 5 我们使用 SMO 创建数据库 但我们通常使用Dapper连接并查询数据库 这是我到目前为止的代码 它有效 Syst
  • WebAPI OAuth 注销 - 如何删除令牌 Cookie?

    我有一个带有 OAuth 登录配置的 WebAPI 如下所示 app UseOpenIdConnectAuthentication new OpenIdConnectAuthenticationOptions ClientId client
  • 如何找到与正方形周长相交的 Voronoi 图的悬垂线的交点?

    我试图通过查找与定义的正方形周长相交的悬垂多边形线的交点来更新 Voronoi 的交点数组 我希望能够重新创建一个新的 Voronoi 交点数组 该数组应该用相交点替换那些悬垂点 下面是我为实验创建的一些代码 function grainn
  • 使用 iTextSharp 将图像转换为 PDF 并保留剪切路径

    我们希望以编程方式将图像批量转换为 PDF 到目前为止 我们似乎将使用 iTextSharp 但我们在使用剪切路径的 JPG 图像时遇到问题 我们在测试中使用以下代码 using FileStream fs new FileStream o
  • 删除 Postgresql 中连续的重复行

    我有一个包含 3 列 id 金额 时间 的表 该表根据id升序排列 我想删除除第一个之外在金额列中具有相同值的所有连续行 eg id 12 15 16 17 19 22 amount 555 546 546 53 53 500 time A
  • 通用Web表单的数据库设计

    我想构建一个通用网络表单的后端 其中包含用户可以回答的问题 问题有多种类型 普通 文本问题 通过简单的文本字段回答问题 Example 一般个人信息 例如姓名 文本区域问题 相同 但有更多空间来写答案 Example 您要添加的更多信息 框
  • 通过 Odoo 中的代码发送电子邮件时出错

    我创建了一个通过单击模块 linh warehoues 中的按钮 发送电子邮件 来发送电子邮件的函数 但出现以下错误 关系 mail thread 不存在 我实在不明白这是什么意思 我还检查了 mail thread py 中存在 mail
  • if 语句中的 getline

    从我读到的来看 getline 在布尔上下文中使用会返回隐式转换为void 我在网络上没有找到任何真正引用此声明的地方 它到处都说隐式转换不存在 并且在布尔上下文中指针应该是相同类型的 并且如果ptr 0 than 0转换为指针类型ptr
  • 检查嵌套字典内的成员资格

    这是此问题的后续问题 Python DictReader 跳过缺少列的行 事实证明我很愚蠢 并且使用了错误的 ID 字段 顺便说一句 我在这里使用的是 Python 3 x 我有一个员工字典 由字符串 directory id 索引 每个值