题目要求:
表:Triangles
+-------------+------+
| Column Name | Type |
+-------------+------+
| A | int |
| B | int |
| C | int |
+-------------+------+
(A, B, C) 是这张表的主键。
每一行包含三角形三边的长度。
编写一个查询来找到 三角形 的类型。对于每一行输出下面的其中一个:
Equilateral:3 边长度相同的三角形。
Isosceles:2 边长度相同的三角形。
Scalene:3 边长度不同的三角形。
Not A Triangle:给定的 A ,B,C 的值不能形成三角形。
以 任何顺序 返回结果表。
结果格式如下所示。
示例 1:
输入:
Triangles 表:
+----+----+----+
| A | B | C |
+----+----+----+
| 20 | 20 | 23 |
| 20 | 20 | 20 |
| 20 | 21 | 22 |
| 13 | 14 | 30 |
+----+----+----+
输出:
+----------------+
| triangle_type |
+----------------+
| Isosceles |
| Equilateral |
| Scalene |
| Not A Triangle |
+----------------+
解释:
- 第一行的值形成了等腰三角形,因为 A = B。
- 第二行的值形成了等边三角形,因为 A = B = C.
- 第三行的值形成了斜三角形,因为 A != B != C.
- 第四行中的值不能形成三角形,因为边 A 和边 B 的和不大于边 C。
MySQL解法:
首先一共有四个条件判断,要求返回判断的值,并且将这些值返回到一个新的名为:“triangle_type ”数据框。面对这种情况,可以使用流程判断函数case when来进行解释,最后将返回的逻辑判断值命名为triangle_type 即可完成赋值到新表的操作:
# Write your MySQL query statement below
#经典的MySQL的逻辑判断返回新值,并且保存到新的表中。这个逻辑返回值可以利用case when来表示
SELECT
CASE
WHEN A+B<=C OR A+C<=B OR B+C<=A THEN 'Not A Triangle'
WHEN A = B AND B = C THEN 'Equilateral'
WHEN A = B OR A = C OR B = C THEN 'Isosceles'
WHEN A != B AND A != C AND B != C THEN 'Scalene'
END AS triangle_type
FROM Triangles
PANDAS解法:
知道了MySQL的解法后,逻辑便知晓了,接下来把这套逻辑以python的形式表达出来即可:
首先设置一共外置的自定义函数,转码由来进行逻辑判断,返回判断值
然后新建一个空表格,就是triangle_type 表
最后再空表格内新建一列,再将原数据表通过apply函数遍历传入自定义函数,将遍历函数返回的结果赋值给该列即可:
import pandas as pd
def type_of_triangle(triangles: pd.DataFrame) -> pd.DataFrame:
# 自定义逻辑判断函数
def panduan(row):
# 检查是否不是三角形
if row['A'] + row['B'] <= row['C'] or row['A'] + row['C'] <= row['B'] or row['B'] + row['C'] <= row['A']:
return 'Not A Triangle'
# 检查是否是等边三角形
if row['A'] == row['B'] and row['B'] == row['C']:
return 'Equilateral'
# 检查是否是等腰三角形
if row['A'] == row['B'] or row['B'] == row['C'] or row['A'] == row['C']:
return 'Isosceles'
# 否则是不等边三角形
return 'Scalene'
#这里新建一个数据框,来保存之后逻辑判断的结构
triangle_type = pd.DataFrame()
#再新建的数据框中添加一个新列triangle_type,通过apply函数的方式遍历传入triangles表的自定义判断函数,按行输出
triangle_type['triangle_type'] = triangles.apply(panduan, axis=1)
return triangle_type