微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

传递列表时如何遍历 *args?

如何解决传递列表时如何遍历 *args?

我编写了以下函数,它将数据帧的任意数量的列作为列表,然后打印指定列的中位数:

def calculate_median(dataframe,*args,*kwargs):
    print("Median of columns: ")
    for colname in args or kwargs.values():
        median_of_column = np.median(dataframe[colname])
        print(f"{median_of_column}",sep="\n")
    return colname

因此,如果我在数据框中有以下列列表:

colnames = ['Col A','Col B','Col C','Col D']

我遇到的问题是解释器将整个列表作为一个整体参数,并显示第一列(Col A)的中位数。

我不确定我做错了什么。你能帮忙吗?

解决方法

如果你像这样调用你的函数:

df = ...
colname = calculate_median(df,colnames)

你需要这样称呼它:

df = ...
colname = calculate_median(df,*colnames)

*args 参数表示“任意数量的非关键字(即未命名)参数”。如果您只传递一个列表 (colnames),则它是单个参数,而不是多个参数。传递 *colnames 的意思是“解压此列表并将其中的项目用作参数”。

,

首先,您在 *kwargs 上缺少一个星号。您的函数签名应该是:

def calculate_mean(dataframe,*args,**kwargs):

其次,我不确定您的 for 循环是否按照您的想法执行。目前它会迭代 args 并且只在 args 为 kwargs.values() 或为空的情况下迭代 None。如果您想始终迭代两者,您可以将 kwargs.values() 转换为元组,使其具有与 args 相同的类型,然后将它们连接起来:

for colname in args + tuple(kwargs.values()):

然后你会像这样调用你的函数:

calculate_mean('Col A','Col B','Col C','Col D')

或者如果你有一个列表:

colnames = ['Col A','Col D']

并且您想以列表的每个成员作为参数调用该函数,则需要在调用该函数时使用星号对列表进行解包:

calculate_mean(*colnames)
,

您需要将 *df.columns 作为 *args 参数传递以获得所需的结果。因为只传递 df.columns 不会解压列的值。

我不明白你为什么需要 *kwargs 参数。

,
import numpy as np
import pandas as pd

df = pd.DataFrame({"a": [1,2,3,4,5],"b": [11,22,33,44,55],"c": [111,222,333,444,555]})
print(df)

# error: need double *
def calculate_median(dataframe,**kwargs):
    print("Median of columns: ")
    for colname in args or kwargs.values():
        median_of_column = np.median(dataframe[colname])
        print(f"{median_of_column}",sep="\n")
    return colname
# get dataframe column names 
colnames= df.columns.values
print(f"colnames type={type(colnames)}")
print(f"colnames values={colnames}")
# call function
calculate_median(df,*colnames)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。