首页 > 解决方案 > Python lambda 函数,遍历一个元组和一个列表

问题描述

假设您有一个包含属性的类表:记录(字典列表)和作为每个表的主键的键(就像 SQL 一样) - 元组

我需要编写一个 lambda 函数,该函数采用新行,然后如果新行中键的所有值都已经在表中,则吐出 True 或 False

例如:

# Table: orders

keys = ('product_id', 'customer_id')

records: [{'product_id': 51, 'customer_id' : 10, 'units':9},
          {'product_id': 32, 'customer_id' : 11, 'units':33},
          {'product_id': 39, 'customer_id' : 47, 'units':2}]

现在我们要检查的新行是:

{'product_id': 51, 'customer_id' : 10, 'units': 77 }

这将返回True,因为product_id==51并且customer_id==10就像记录中的第一个字典一样(单位无关紧要,因为它不是键)。

然而这:

{'product_id': 51, 'customer_id' : 11, 'units':9}

将返回False,因为没有带有product_id==51and的行customer_id==11

我们必须使用 lambda 函数(我们不必使用过滤器,只是一个提示)
我尝试了许多不同的“攻击”这个问题的方法,但我无法遍历键列表和元组同时...

contains_key = lambda self, new_row: list(filter(  
  (lambda con: con[self.__key]), 
  [record for record in self.__records] 
))

解释:self 是我们操作的表,new_row 是要检查的行(字典)
self.__keys 是键的元组(就像 sql 中的主键),self.__records 是字典的列表="""rows in an sql table""")
该函数位于类 Table 中(这就是它采用“self”形式的原因)

class Table:
    def __init__(self, key_set):
        self.__key = tuple(key_set)
        self.__records = []

    def add_record(self, new_record):
        self.__records.append(new_record)

标签: pythonpython-3.xlambda

解决方案


一个简单的使用anyandall就可以了:“检查记录的allany是否与新记录相同”

print(any(all(new_record[key] == record[key] for key in keys) for record in records))

这些功能的好处是短路:每当键不匹配时 - 记录将被跳过,并且当记录匹配时 - 将不再检查记录。


我会把它留给你作为练习,把它变成一个lambda:)


推荐阅读