Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将递归函数的中间结果放入列表中?_Python_Pandas_Loops_Recursion - Fatal编程技术网

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方式使用代码,您一定要遵循这些见解!:哈,我离得太近了!哈,我离得太近了!我同意。这段代码只是我真正需要做的事情的简化版本。所以我仍然必须使用递归。无论如何谢谢你!我同意。这段代码只是我真正需要做的事情的简化版本。所以我仍然必须使用递归。无论如何谢谢你!