【问题标题】:Slicing the Values of a Dictionary切片字典的值
【发布时间】:2018-12-31 12:58:23
【问题描述】:

我正在尝试编写一个接受三个参数的函数:字典emp_dict、字符串username 和数字emp_no

字典中的键值存储员工编号作为键和员工姓名的字符串。用户名的前三个字母或后三个字母必须与员工姓名的前三个字母匹配。

如何将字符串 username 与字典的前三个值字段中的每一个进行比较。

其他约束包括:

  • 给定的员工编号存在于字典中
  • 用户名必须至少为 4 个字符
  • 用户名的前三个字母或后三个字母必须与员工姓名的前三个字母匹配

这是我目前所拥有的:

def validate_employee(emp_dict, username, emp_no):
if emp_no not in emp_dict:
    return False
elif len(username) < 4:
    return False

这就是我遇到麻烦的地方。后面两个 elif 怎么写?

elif username[0:2}.lower == emp_dict.values():
    return True




emp_dict={1111:'Sim',1234:'James',9999:'Amy',5555:'Jessica'}
username='Jess' 
emp_no=5555
print(validate_employee(emp_dict, username, emp_no))

如果我没有很好地提出这个问题,或者我犯了一些相当新手的错误,我深表歉意。一般来说,我对 StackOverflow 和 Python 编程还是很陌生。我有时在逻辑上思考一些问题时会遇到一些麻烦。

感谢您提供的任何帮助!

【问题讨论】:

    标签: python loops dictionary if-statement slice


    【解决方案1】:

    你只需要写一个逻辑就是:

    elif username[:3] in map(lambda x:x[:3],emp_dict.values()) or username[-3:] in map(lambda x:x[:3],emp_dict.values()):
        return True
    

    或者如果它不区分大小写:

    elif username[:3].lower() in map(lambda x:x[:3].lower(),emp_dict.values()) or username[-3:].lower() in map(lambda x:x[:3].lower(),emp_dict.values()):
        return True
    

    例子:

    >>> emp_dict={1111:'Sim',1234:'James',9999:'Amy',5555:'Jessica'}
    >>> username='Jess'
    >>> username[:3] in map(lambda x:x[:3],emp_dict.values())
    True
    

    【讨论】:

      【解决方案2】:

      你可以做的更简单和简洁:

      def validate_employee(emp_dict, username, emp_no):
          if emp_no not in emp_dict:
              return False
          if len(username) < 4:
              return False
      
          head = username[:3]
          if list(filter(lambda x: x[:3] == head or x[:3] == head, emp_dict.values())):
              return True
      

      没有必要在带有return 的语句之后写elif(有时这样的语句也称为守卫)。

      【讨论】:

        【解决方案3】:

        我对内置 any()str.startswith() 的尝试:

        employees = {}
        employees[0] = 'smith john'
        employees[1] = 'paolo smith'
        employees[3] = 'jack daniels'
        
        
        def validate(emp_dict, username, emp_no):
            if emp_no not in emp_dict:
                return False
        
            if len(username) < 4:
                return False
        
            if not any(e.startswith(username[:3]) or e.startswith(username[-3:]) for e in emp_dict.values()):
                return False
        
            return True
        
        print(validate(employees, 'paolo john', 3))
        print(validate(employees, 'john paolo', 3))
        

        打印:

        True
        False
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-14
          • 2015-05-26
          • 2020-09-20
          • 2020-02-08
          • 1970-01-01
          • 2021-11-19
          • 2015-07-26
          相关资源
          最近更新 更多