我正在尝试执行以下操作:
public static void makeMatches(List<Person> list1, List<Person> list2) {
// set each person to be free
for (Person m : list1) {
m.erasePartner();
}
for (Person w: list2) {
w.erasePartner();
}
int m1 = stillNotEngaged(list1, list2);
while (m1 != -1) { // at least one not engaged and has choices
int w1 = m.getFirstChoice();
Person m = list1.get(m1);
Person w = list2.get(w1);
if (!w.hasPartner()) {
m.setPartner(w1);
w.setPartner(m1);
}
// if chosen woman has partner, set her to be free and engage her and man
else if (w.hasPartner()) {
// assuming preferences are in descending order, so index 0 is the first priority choice
if (w.getPartnerRank() > w.getChoices().indexOf(m1)) {
list1.get(w.getPartner()).erasePartner();
w.setPartner(m1);
m.setPartner(w1);
}
}
m.removeChoice(w1);
m1 = stillNotEngaged(list1, list2);
}
}
它看起来很愚蠢而且效率低下。有没有很酷的方法来创建一个函数来对此进行循环?我只是不敢将数字放在pct_change()的括号内。
答案 0 :(得分:3)
为什么没有简单的for
循环?
for n in list(range(1, 20)) + list(range(30, 270, 20)):
df[f'SR{n}'] = df['Open'].pct_change(n)
注意:f字符串符号仅在Python> = 3.6中有效,并且等效于'SR{}'.format(n)
。
答案 1 :(得分:1)
也许
for n in numbers:
df['SR'+str(n)] = df['Open'].pct_change(n)
其中numbers
包含您要处理的所有索引。
答案 2 :(得分:1)
如果您想提高效率,请不要使用循环。您可以将assign
与字典理解结合使用。
df = df.assign(**{f'SR{n}': df['Open'].pct_change(n)
for n in list(range(1, 21)) + list(range(30, 270, 20))})
还是不使用f字符串:
df = df.assign(**{'SR{n}'.format(n): df['Open'].pct_change(n)
for n in list(range(1, 21)) + list(range(30, 270, 20))})
时间
使用字典理解功能快一些。
df = pd.DataFrame({'Open': range(252 * 5)})
%%timeit
df.assign(**{f'SR{n}': df['Open'].pct_change(n)
for n in list(range(1, 21)) + list(range(30, 270, 20))})
# 25.3 ms ± 2.45 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%%timeit
for n in list(range(1, 21)) + list(range(30, 270, 20)):
df[f'SR{n}'] = df['Open'].pct_change(n)
# 28.3 ms ± 3.2 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)