【头歌-Python】期末测试-第7关:二手房数据统计
第7关:二手房数据统计
0.内心阐述:
作为一个勤奋好学(天天想着抄作业)的我,居然发现全网都找不到这题的答案,让我很是“失望”。既然全网都没有这个答案,那就由我来为大家解答吧。在座的各位朋友们,如果你们觉得我的努力值得认可,能不能给我一个小赞呢?这不仅是对我工作的肯定,也是对我继续探索和分享知识的鼓励。在这里谢谢大家咯!
1.要求:
任务描述
读取附件csv文件。
文件内容如下:
要求:
根据输入n完成下列功能:(文件编码格式为utf-8)
本题内如需排序,为保证排序结果测试正确,必须采用直接排序取前k位。
例如:
需要取最高前20位时,必须从大到小排序,取前20位数据。不允许从小到大排序,再逆序取数据。
需要取最低前20位时,必须从小到大排序,取前20位数据。不允许从大到小排序,再逆序取数据。
若n为'最低总价',则可以继续输入一个整数k,输出'价格'列最低的前k位,行内数据以空格为间隔。格式见输入输出示例
若n为'最大面积',则可以继续输入一个整数k,输出'面积'列最大的前k位,行内数据以空格为间隔。格式见输入输出示例
若n为'最低单价',输出每平米价格最低的1条房源信息(按公式计算:每平米价格=价格/面积),行内数据以空格为间隔。格式见输入输出示例
若n为'毛坯电梯房单价',输出数据中所有满足'有电梯'并且装修情况为'毛坯'的房屋的每平米平均价格(按公式计算:每平米平均价格=总价格/总面积),格式见输入输出示例
若n为'年份',则可以继续输入字符串s,如果有年份为s的数据,输出年份为s的房屋套数;如果没有匹配数据,输出'无数据',格式见输入输出示例
如果非以上输入,则在小区名中查找是否包含n,并输出所有包含n字段的小区房源信息(按文件数据原有顺序),行内数据以空格为间隔。如果没有数据,则输出'未找到相关数据',格式见输入输出示例示例 1
输入:
最低总价
3输出:
市区 小区 户型 朝向 楼层 装修情况 电梯 面积(㎡) 价格(万元) 年份
海淀 辉煌国际 2房间1卫 北 23 简装 有电梯 63 191 2007
海淀 砂轮厂宿舍 2室1厅 南北 7 简装 无电梯 59 260 1998
海淀 同泽园西里 2室1厅 南北 6 精装 无电梯 67 260 2012示例 2
输入:
最大面积
2输出:
市区 小区 户型 朝向 楼层 装修情况 电梯 面积(㎡) 价格(万元) 年份
海淀 西山壹号院 4室3厅 东南 6 毛坯 有电梯 561 4150 2011
海淀 西山壹号院 4室3厅 南北 6 精装 无电梯 435 3500 2013示例 3
输入:
最低单价输出:
市区 小区 户型 朝向 楼层 装修情况 电梯 面积(㎡) 价格(万元) 年份
海淀 辉煌国际 2房间1卫 北 23 简装 有电梯 63 191 2007示例 4
输入:
毛坯电梯房单价
输出:
7.77万元示例 5
输入:
年份
2006输出:
99套示例 6
输入:
年份
203输出:
无数据示例 7
输入:
蜂窝输出:
市区 小区 户型 朝向 楼层 装修情况 电梯 面积(㎡) 价格(万元) 年份
海淀 北蜂窝30号院 2室1厅 南北 5 简装 无电梯 50 385 1980
海淀 北蜂窝路5号院 1室1厅 西南 16 简装 有电梯 59 650 2009
海淀 北蜂窝路5号院 3室1厅 西南 16 精装 有电梯 118 1330 2009
海淀 北蜂窝30号院 2室1厅 南北 5 简装 无电梯 73 540 1974
海淀 北蜂窝路5号院 2室1厅 南 18 精装 有电梯 77 898 2009
海淀 北蜂窝路5号院 2室1厅 东南 17 精装 无电梯 79 880 2009
海淀 北蜂窝103号院 1室1厅 南 6 毛坯 无电梯 40 320 1981
海淀 北蜂窝30号院 2室1厅 东西 3 简装 无电梯 53 400 1970示例 8
输入:
武汉输出:
市区 小区 户型 朝向 楼层 装修情况 电梯 面积(㎡) 价格(万元) 年份
未找到相关数据
2.代码如下:
def read_data(file):
ls1 = []
with open(file, 'r', encoding='utf-8') as f:
for ls in f:
ls2 = ls.strip().split(',')
ls1.append(ls2)
return ls1
def sorted_data(ls1, n):
header = ls1[0]
ls_1 = ls1[1:]
isFilter = False
if n == '最低总价':
k = int(input())
ls_2 = sorted(ls_1, key=lambda x: float(x[8])) # 价格在第8列
data_sorted = [header] + ls_2[:k]
isFilter = True
elif n == '最大面积':
k = int(input())
ls_2 = sorted(ls_1, key=lambda x: float(x[7]), reverse=True) # 面积在第7列
data_sorted = [header] + ls_2[:k]
isFilter = True
elif n == '最低单价':
min_price_per_square_meter = float('inf')
min_entry = None
for entry in ls_1:
price = float(entry[8])
area = float(entry[7])
price_per_square_meter = price / area
if price_per_square_meter < min_price_per_square_meter:
min_price_per_square_meter = price_per_square_meter
min_entry = entry
data_sorted = [header] + [min_entry]
isFilter = True
elif n == '毛坯电梯房单价':
total_price = 0
total_area = 0
count = 0
for entry in ls_1:
if entry[5] == '毛坯' and entry[6] == '有电梯':
total_price += float(entry[8])
total_area += float(entry[7])
count += 1
if count > 0:
average_price_per_square_meter = total_price / total_area
data_sorted = [f"{average_price_per_square_meter:.2f}万元"]
else:
data_sorted = ['无数据']
elif n == '年份':
s = input().strip()
count = sum(1 for entry in ls_1 if entry[9] == s) # 年份在第9列
data_sorted = [f"{count}套"] if count > 0 else ['无数据']
else:
print(' '.join(str(x) for x in header))
found_entries = [entry for entry in ls_1 if n in entry[1]] # 小区名在第1列
if found_entries:
data_sorted = found_entries
isFilter = True
else:
data_sorted = ['未找到相关数据']
if isFilter:
for line in data_sorted:
print(' '.join(map(str, line)))
else:
for line in data_sorted:
print(line)
if __name__ == '__main__':
file = 'step8/house.csv'//地址在网页找
house_data = read_data(file)
n = input().strip()
sorted_data(house_data, n)
3.结果:(千里迢迢来相会,你知道我为了见你,我干了多少事吗)
4.番外:
我们会发现附件的地址在题目那是找不到的,题目没给,那也不能靠自己猜呀,是吧。那就证明它给了,我们没发现。那附件地址到底在哪呢,找了半天,发现它居然在这(如图)。好好好这样玩我是吧,那我辛辛苦苦找的那几个小时算什么……
作者:培根1932