问题描述
我正在练习一些考试题,但遇到了一个我无法弄清楚的时间限制问题。我认为这与我如何遍历输入有关。
这是著名的泰坦尼克号数据集,所以我不会费心打印 df 的样本,因为我相信每个人都熟悉它。
该函数比较作为输入提供的两个乘客之间的相似性。此外,我正在用整数映射 Sex 列,以便在您将在下面看到的乘客之间进行比较。
我还想这可能是我如何索引和定位每位乘客的价值,但我又不确定
函数如下,时间限制为 1 秒,但当 no_of_queries == 100 时,函数需要 1.091s。
df = pd.read_csv("titanic.csv")
mappings = {'male': 0,'female':1}
df['Sex'] = df['Sex'].map(mappings)
def function_similarity(no_of_queries):
for num in range(int(no_of_queries)):
x = input()
passenger_a,passenger_b = x.split()
passenger_a,passenger_b = int(passenger_a),int(passenger_b)
result = 0
if int(df[df['PassengerId'] == passenger_a]['Pclass']) == int(df[df['PassengerId'] == passenger_b]['Pclass']):
result += 1
if int(df[df['PassengerId'] ==passenger_a]['Sex']) == int(df[df['PassengerId'] ==passenger_b]['Sex']):
result += 3
if int(df[df['PassengerId'] ==passenger_a]['SibSp']) == int(df[df['PassengerId'] ==passenger_b]['SibSp']):
result += 1
if int(df[df['PassengerId'] == passenger_a]['Parch']) == int(df[df['PassengerId'] == passenger_b]['Parch']):
result += 1
result += max(0,2 - abs(float(df[df['PassengerId'] ==passenger_a]['Age']) - float(df[df['PassengerId'] ==passenger_b]['Age'])) / 10.0)
result += max(0,2 - abs(float(df[df['PassengerId'] ==passenger_a]['fare']) - float(df[df['PassengerId'] ==passenger_b]['fare'])) / 5.0)
print(result / 10.0)
function_similarity(input())
解决方法
按每个乘客 a 和 b 的 id 值计算一次乘客行。
df = pd.read_csv("titanic.csv")
mappings = {'male': 0,'female':1}
df['Sex'] = df['Sex'].map(mappings)
def function_similarity(no_of_queries):
for num in range(int(no_of_queries)):
x = input()
passenger_a,passenger_b = x.split()
passenger_a,passenger_b = df[df['PassengerId'] == int(passenger_a)],df[df['PassengerId'] == int(passenger_b)]
result = 0
if int(passenger_a['Pclass']) == int(passenger_b['Pclass']):
result += 1
if int(passenger_a['Sex']) == int(passenger_b['Sex']):
result += 3
if int(passenger_a['SibSp']) == int(passenger_b['SibSp']):
result += 1
if int(passenger_a['Parch']) == int(passenger_b['Parch']):
result += 1
result += max(0,2 - abs(float(passenger_a['Age']) - float(passenger_b['Age'])) / 10.0)
result += max(0,2 - abs(float(passenger_a['Fare']) - float(passenger_b['Fare'])) / 5.0)
print(result / 10.0)
function_similarity(input())