背景介绍
最近在测试一个数据清洗的功能,其中有一个type字段的规则是:源数据包含字段“field1”,”field2“或“field3"的时候,type = 101 。大概就是这样的一个类似的需求。当然,后面肯定还有很多其他的映射关系,这里就不一一列举。假设源数据是source_data,接下来看看我是怎么去写的:
方法一、使用if判断
这是我一开始能想到的最笨拙的办法,就是代码写起来有点太长了,可读性倒是还行。伪代码如下:
if "field1" in source_data or "field2" in source_data or "field3" in source_data:
type = 101
elif "field3" in source_data or "field4" in source_data or "field5" in source_data:
type = 102
方法二、使用for循环
以下是使用 for 循环来判断一个字符串是否包含在一个列表中的某一个元素的示例代码:
def is_field_in_list(source_data, field_list):
for field in field_list:
if field in source_data:
return True
return False
在上面的示例代码中,我们定义了一个名为 is_field_in_list 的函数,该函数接受两个参数:一个源数据和一个列表。该函数使用 for 循环遍历列表中的每个元素,如果源数据中包含该字段,该函数将返回 True。如果源数据中不包含列表中的任意一个字段的话,该函数将返回 False。
调用函数后的用法:
field_list = ["field1","field2","field3"]
if is_field_in_list(source_data, field_list):
type = 101
方法三、使用any函数结合生成器
field_list = ["field1","field2","field3"]
if any(field in source_data for field in field_list):
type = 101
any 函数接受一个迭代器作为参数,并返回一个布尔值。在上面的代码中,我们使用生成器表达式 field in source_data for field in field_list 来生成一个包含布尔值的迭代器,其中每个布尔值表示列表中的一个元素是否出现在 source_data 中。如果迭代器中的任何一个布尔值为 True,则 any 函数返回 True,否则返回 False。
您点的每个赞,我都认真当成了喜欢