比较具有不同结构的两个数据



你好,我一点编程技能都没有。我只是在网上搜索,发现python可以帮助我解决这个问题。

到目前为止,我所做的只是:使用pandas打开python中的数据,并使用CCD_-"以将两个数据分成列。一个数据是我所说的模板数据,它具有标准值。其他数据是具有不同值的标准数据以及模板数据中未包含的数据的源。

我想做的是获得输出数据,这些数据用标准数据检查值,如果低于或等于模板值,则为true,如果大于模板值,那么为false。

数据看起来像这样:

模板数据:

A-100-50
B-C-01-80
D-E-06-75-60
F-G-H-08-15-90-I

源数据:

A-95-51
A-105-51
A-95-40
B-C-01-75
D-E-06-76-59
D-E-06-74-61
D-E-06-74-59
F-G-H-08-15-91-I
F-G-H-08-15-75-I
M-45-50

输出:

Name    |Status
A-95-51 | False
A-105-51    | False
A-95-40 | True
B-C-01-75   | True
D-E-06-76-59    | False
D-E-06-74-61    | False
D-E-06-74-59    | True
F-G-H-08-15-91-I    | False
F-G-H-08-15-75-I    | True
M-45-50 | NOT FOUND

只有粗体的值才需要验证。谢谢希望详细回复

似乎手头有两项任务:

  1. 解析模板数据(可能进入字典(
  2. 创建一个比较函数,比较两个值(模板与源(并相应地返回True/False

以下是如何做到每一点的概述:

  1. 分析模板数据。我们将创建一个解析函数,稍后也可以使用它来解析源数据
template_data = """A-**100-50**
B-C-01-**80**
D-E-06-**75-60**
F-G-H-08-15-**90**-I"""
def parse(line: str):
""" Obtain the values before and in between the ** """
if "**" in line:
return line.split("**")[:2]
else:
# handle the case in which there are no **
return ['', '']
template = {}
for line in template_data.split("n"):
k, v = parse(line)
template[k] = v
# print(template)
# {'A-': '100-50', 'B-C-01-': '80', 'D-E-06-': '75-60', 'F-G-H-08-15-': '90'}
  1. 比较功能。你没有告诉我们你是将74-61解释为减法还是仅仅是一对由"1"分隔的数字-&";。我猜一猜,认为他们是一对。。。并且只有当所有值都高于…时,它才应该为True。。。但如果没有,只需根据您的需要调整功能即可
def is_left_bigger(a, b):
return all(map(lambda x, y: int(x) > int(y) , a.split("-"), b.split("-")))

让我通过构建它来解释这一行:

  • lambda x, y: int(x) > int(y)只是一个lambda函数,用于比较第一个参数的整数表示是否大于第二个参数的表示
  • map(lambda x, y: int(x) > int(y), a.split("-"), b.split("-"))将lambda比较函数应用于我们正在传递的两个列表的所有元素(它们只是每个模板和源的分离元素(
  • 最后,只有当all(...)中的所有元素都为True时,它才会返回True,否则返回False。如果需要返回True。如果至少有一个为True,请改用any函数

最后一步是解析源并使用模板字典和比较函数:

source_data = """A-**95-51**
A-**105-51**
A-**95-40**
B-C-01-**75**
D-E-06-**76-59**
D-E-06-**74-61**
D-E-06-**74-59**
F-G-H-08-15-**91**-I
F-G-H-08-15-**75**-I
M-45-50"""
for line in source_data.split("n"):
k, v = parse(line)
if v == "":
print(line, " | NOT FOUND")
else:
print(line, " | ", is_left_bigger(template[k],v))

输出:

A-**95-51**  |  False
A-**105-51**  |  False
A-**95-40**  |  True
B-C-01-**75**  |  True
D-E-06-**76-59**  |  False
D-E-06-**74-61**  |  False
D-E-06-**74-59**  |  True
F-G-H-08-15-**91**-I  |  False
F-G-H-08-15-**75**-I  |  True
M-45-50  | NOT FOUND

最新更新