Python 如何将递归函数的中间结果放入列表中?
我编写了一个简单的递归函数来删除最大和的列,直到数据帧减小到我想要的大小。代码如下:Python 如何将递归函数的中间结果放入列表中?,python,pandas,loops,recursion,Python,Pandas,Loops,Recursion,我编写了一个简单的递归函数来删除最大和的列,直到数据帧减小到我想要的大小。代码如下: s = pd.DataFrame({'a': [1,1,1,1,1,1], 'b': [2,2,2,2,2,2], 'c': [3,3,3,3,3,3], 'd': [4,4,4,4,4,4], 'e': [5,5,5,5,5,5]}) def recSel
s = pd.DataFrame({'a': [1,1,1,1,1,1],
'b': [2,2,2,2,2,2],
'c': [3,3,3,3,3,3],
'd': [4,4,4,4,4,4],
'e': [5,5,5,5,5,5]})
def recSelect(inputdf):
if inputdf.shape[1]<=2:
return inputdf
else:
total = inputdf.sum()
idx = total.idxmax()
inputdf.drop(idx, axis=1, inplace=True)
return recSelect(inputdf)
recSelect(s)
在上述代码中,首先删除列“e”,然后删除列“d”,然后删除列“c”。我的问题是:我如何正确地返回'idx'并获得一个名为['e','d','c']的列表
以下是我尝试过但不起作用的方法:
idxs = [] # create an empty list
def recSelect(inputdf):
if inputdf.shape[1]<=2:
return inputdf
else:
total = inputdf.sum()
idx = total.idxmax()
idxs.append(idx) # append each idx
inputdf.drop(idx, axis=1, inplace=True)
return recSelect(inputdf), idxs
您可以尝试以下代码:
your_list = list() # the traking list
s = pd.DataFrame({'a': [1,1,1,1,1,1],
'b': [2,2,2,2,2,2],
'c': [3,3,3,3,3,3],
'd': [4,4,4,4,4,4],
'e': [5,5,5,5,5,5]})
def recSelect(inputdf):
if inputdf.shape[1]<=2:
return inputdf
else:
total = inputdf.sum()
idx = total.idxmax()
your_list.append(idx) # append the dropped idx
inputdf.drop(idx, axis=1, inplace=True)
return recSelect(inputdf)
recSelect(s)
print your_list # there you go!
输出['e','d','c']您可以尝试以下代码:
your_list = list() # the traking list
s = pd.DataFrame({'a': [1,1,1,1,1,1],
'b': [2,2,2,2,2,2],
'c': [3,3,3,3,3,3],
'd': [4,4,4,4,4,4],
'e': [5,5,5,5,5,5]})
def recSelect(inputdf):
if inputdf.shape[1]<=2:
return inputdf
else:
total = inputdf.sum()
idx = total.idxmax()
your_list.append(idx) # append the dropped idx
inputdf.drop(idx, axis=1, inplace=True)
return recSelect(inputdf)
recSelect(s)
print your_list # there you go!
输出['e','d','c']尽量避免使用全局变量-在递归中使用它!向函数中添加一个额外的参数。这将需要一个列表来存储删除的列名,但我们将默认值设置为“无”,这样列表就不会在函数调用之间共享。在第一次调用时初始化空列表,并在每次删除列时更新它
import pandas as pd
s = pd.DataFrame({'a': [1,1,1,1,1,1],
'b': [2,2,2,2,2,2],
'c': [3,3,3,3,3,3],
'd': [4,4,4,4,4,4],
'e': [5,5,5,5,5,5]})
def recSelect(inputdf, removed=None):
if not removed:
removed=[]
if inputdf.shape[1]<=2:
return inputdf, removed
else:
total = inputdf.sum()
idx = total.idxmax()
inputdf.drop(idx, axis=1, inplace=True)
removed.append(idx)
return recSelect(inputdf, removed)
vals, removed = recSelect(s)
print(removed)
尽量避免使用全局变量-在递归中使用它!向函数中添加一个额外的参数。这将需要一个列表来存储删除的列名,但我们将默认值设置为“无”,这样列表就不会在函数调用之间共享。在第一次调用时初始化空列表,并在每次删除列时更新它
import pandas as pd
s = pd.DataFrame({'a': [1,1,1,1,1,1],
'b': [2,2,2,2,2,2],
'c': [3,3,3,3,3,3],
'd': [4,4,4,4,4,4],
'e': [5,5,5,5,5,5]})
def recSelect(inputdf, removed=None):
if not removed:
removed=[]
if inputdf.shape[1]<=2:
return inputdf, removed
else:
total = inputdf.sum()
idx = total.idxmax()
inputdf.drop(idx, axis=1, inplace=True)
removed.append(idx)
return recSelect(inputdf, removed)
vals, removed = recSelect(s)
print(removed)
如果你对我解决这个问题的方法很满意,为什么要创建一个递归函数呢?如果你可以按和对值进行排序,并且可以访问它们的索引。i、 e
s = pd.DataFrame({'a': [1,1,1,1,1,1],
'b': [2,2,2,2,2,2],
'c': [5,5,5,5,5,5],
'd': [4,4,4,4,4,4],
'e': [1,5,5,5,5,5]})
sum_order = s.sum().sort_values().index
ndf = s[sum_order[:2]]
li = sum_order[2:][::-1].tolist()
输出:
ndf
a b
0 1 2
1 1 2
2 1 2
3 1 2
4 1 2
5 1 2
li
['c', 'e', 'd']
当你在熊猫中时,尽量避免循环。如果你对我解决这个问题的方法很满意,为什么要创建一个递归函数呢?如果你可以按和对值进行排序,并且可以访问它们的索引。i、 e
s = pd.DataFrame({'a': [1,1,1,1,1,1],
'b': [2,2,2,2,2,2],
'c': [5,5,5,5,5,5],
'd': [4,4,4,4,4,4],
'e': [1,5,5,5,5,5]})
sum_order = s.sum().sort_values().index
ndf = s[sum_order[:2]]
li = sum_order[2:][::-1].tolist()
输出:
ndf
a b
0 1 2
1 1 2
2 1 2
3 1 2
4 1 2
5 1 2
li
['c', 'e', 'd']
当您在panda中时,请尽量避免循环。我认为在以后再次调用函数时,在removed=[]中使用默认值empty list会有问题,因为我认为列表只创建一次,所以在后续调用中列表不会为空@安德烈亚斯格里瓦斯:太棒了!这正是我试图用全局参数避免的,我自己也错过了。现在更新了答案,学到了一些新东西!,非常感谢much@asongtoruin避免使用全局变量有什么好处吗?或者这只是一个很好的做法?@乔西考虑OP的设置创建IDXs外部。每次调用recSelect时,我们都需要首先设置idxs=[],以确保没有继承以前删除的列。这样,应用recSelect输出数据和删除列的所有重要信息都将由函数返回。@user3768495是的,如果您必须以OOP方式使用代码,您一定要遵循这些见解!:我认为在removed=[]中使用默认值empty list会在以后再次调用函数时出现问题,因为我认为列表只创建了一次,所以在后续调用中列表不会为空@安德烈亚斯格里瓦斯:太棒了!这正是我试图用全局参数避免的,我自己也错过了。现在更新了答案,学到了一些新东西!,非常感谢much@asongtoruin避免使用全局变量有什么好处吗?或者这只是一个很好的做法?@乔西考虑OP的设置创建IDXs外部。每次调用recSelect时,我们都需要首先设置idxs=[],以确保没有继承以前删除的列。这样,应用recSelect输出数据和删除列的所有重要信息都将由函数返回。@user3768495是的,如果您必须以OOP方式使用代码,您一定要遵循这些见解!:哈,我离得太近了!哈,我离得太近了!我同意。这段代码只是我真正需要做的事情的简化版本。所以我仍然必须使用递归。无论如何谢谢你!我同意。这段代码只是我真正需要做的事情的简化版本。所以我仍然必须使用递归。无论如何谢谢你!