传递列表时如何遍历 *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)
我编写了以下函数,它将数据帧的任意数量的列作为列表,然后打印指定列的中位数:
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)