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

How do I iterate over *args when passing a list?

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

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']

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

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

如果您这样调用函数:

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

您需要这样称呼它:

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

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

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

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

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

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

其次,我不确定您的 for 循环是否如您所想。目前它将遍历 args 并且仅在 args 为 None 或空的情况下遍历 kwargs.values()。如果你想始终迭代两者,你可以将 kwargs.values() 转换为一个元组,以便它具有与 args 相同的类型,然后连接它们:

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

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

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

或者如果您有列表:

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

并且您想将列表的每个成员作为参数调用该函数,您需要在调用该函数时使用星号解压列表:

calculate_mean(*colnames)
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, *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
# 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)