Python踩坑记录
2019-10-30 本文已影响0人
yumiii_
发现上一篇Python记录写到后面像是我的学习笔记了,还是单开一个记录一下踩坑吧。
1.字典
python3中,使用dict.keys()返回的是<class 'dict_keys'>
这个类型了,可以用list()转换成列表的形式
- ValueError: invalid literal for int() with base 10:
>>> int('5')
5
>>> float('5.0')
5.0
>>> float('5')
5.0
>>> int(5.0)
5
>>> float(5)
5.0
>>> int('5.0')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '5.0'
>>> int(float('5.0'))
5
3.pandas读取的dataframe转列表:
pd_data = pd.read_csv(filename)
diseases = pd_data['DiseaseName'].tolist()
symptom = pd_data["symptom"].tolist()
disease_dict = dict(zip(diseases,symptom))
1⃣️df['a'].values.tolist()
或者df['a'].tolist()
都可,可以不要再傻了吧唧的知道长度之后再去遍历一个一个append到列表里了吗?
2⃣️已知有俩列表,可以用dict(zip())
的形式把这转换成字典。
- 读取文件的时候,按照":"split,然后取data[1]报数组越界,可以检查一下是不是文件有问题吗??比如说可以打印一下是不是哪里切开之后长度不等于2,直接定位到有问题的那一行
5.三目运算
for i in range(query_length):
found = process.extractOne(query[i], choices=disease_dict.keys(), score_cutoff=90)
print(found)
step1_dise.append(found[0] if found else None)
我这里的found输出的有两种形式,一种是None,一种是(‘词’,数字)
step1_dise.append(found[0] if found else None)
这种是Python中的三目运算。
6.列表生成式
里面的if要和for一起用啊。。操。。基础不得行
7.关于执行顺序
这是在学习单元测试的时候发现的问题,关于if elif中判断子句的排序问题。下面这个类,是预期在分数>80时返回A,60<分数<80时返回B,60以下返回C,但在执行单元测试时,需要对<0和>100范围内的分数进行一个RaiseError的操作。
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def get_grade(self):
if self.score >= 80:
return 'A'
elif self.score >= 60:
return 'B'
elif self.score <0 or self.score >100:
raise ValueError("score error")
else:
return 'C'
单元测试代码如下:
class TestStudent(unittest.TestCase):
def test_80_to_100(self):
s1 = Student('Bart', 80)
s2 = Student('Lisa', 100)
self.assertEqual(s1.get_grade(), 'A')
self.assertEqual(s2.get_grade(), 'A')
def test_60_to_80(self):
s1 = Student('Bart', 60)
s2 = Student('Lisa', 79)
self.assertEqual(s1.get_grade(), 'B')
self.assertEqual(s2.get_grade(), 'B')
def test_0_to_60(self):
s1 = Student('Bart', 0)
s2 = Student('Lisa', 59)
self.assertEqual(s1.get_grade(), 'C')
self.assertEqual(s2.get_grade(), 'C')
def test_invalid(self):
s1 = Student('Bart', -1)
s2 = Student('Lisa', 101)
with self.assertRaises(ValueError):
s1.get_grade()
with self.assertRaises(ValueError):
s2.get_grade()
if __name__ == '__main__':
unittest.main()
但始终过不了 test_invalid方法中的s2.get_grade(),其实考虑一下就知道在分数为101的时候走的是分数>80所以返回A的分支,所以RaiseError的操作应该放在分数判断的一开始,即:
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def get_grade(self):
if self.score <0 or self.score >100:
raise ValueError("score error")
elif self.score >= 80:
return 'A'
elif self.score >= 60:
return 'B'
else:
return 'C'