首页 > 解决方案 > 如何在 Python 中将列表作为参数传递和访问

问题描述

让我们考虑以下示例代码,

pre_process.py

import pandas as pd
from sklearn.preprocessing import LabelBinarizer

class PreProcess(object):

    def __init__(self):
        ... .... ....
        ... .... ....

C:  def fit_clms(self, lb_style, dataset, style_clms = ['A', 'B']):
B:        lb_results = lb_style.fit_transform(dataset[style_clms]) # exp. result is, "dataset['X', 'Y']", but it became to "dataset[['X', 'Y']]", pl note the nested list
        # (**Worked - by this line**) lb_results = lb_style.fit_transform(dataset['A', 'B', 'C'])
        print(lb_results)

        if lb_style.classes_.shape[0] > 0:
            ... .... ....
            ... .... ....

    def process_chunks(self, chunks):
        lb_style = LabelBinarizer()
        print('------------------------------------------------\n')
        count = 0
        for dataset in chunks:
            count += 1
            print ('Processing the Chunk %d ...' % count)

            # Group By
            dataset['Grouping_MS'] = dataset[['_time', 'source']].apply(self.group_by_clm, axis=1)
A:            dataset = self.fit_clms(lb_style, dataset, ['X', 'Y'])
                ... .... ....
                ... .... ....            

    def init(self):
        Times.start()
        # Read the Source File
        chunks = self.read_csv_file(SOURCE_FILE, CHUNK_SIZE)    
        self.process_chunks(chunks)
            ... .... ....
            ... .... ....            

在这里,如何传递一个列表,并在“ ”['A', 'B'] (A:)处访问它?(现在它变成了,但我想要['X','Y'],即变成嵌套列表)dataset[style_clms](B:)[['X', 'Y']]

(C:)另外,在函数定义中将列表设置为“默认”参数是否很好?如果不是这样,那么任何替代。实现这一目标的方法?由于 Pylint,会给出类似“ Dangerous default value [] as argument ”的警告

有任何想法吗?谢谢,

标签: pythonpandasdataframe

解决方案


那个[]-default-value 的东西吸引了很多人,所以我先介绍一下。当 Python 运行您的代码时,它会执行以下操作:

def append_two(a=[]):
    a.append(2)
    return a

print(append_two())
print(append_two([1, 2, 3])
print(append_two())

哦,看!函数定义!好的,所以默认值为[]; 让我们评估一下......还有一些代码,但我们先不要运行它。

def append_two(a=<list object at 0x34FE2910>):
    ...

print(append_two())
print(append_two([1, 2, 3])
print(append_two())

好的,现在让我们运行它。附加2[]使[2],所以我们print("[2]")。附加2[1, 2, 3]使[1, 2, 3, 2],所以我们print("[1, 2, 3, 2]")。附加2[2]使[2, 2],所以我们print("[2, 2]")。并做了!

[2]
[1, 2, 3, 2]
[2, 2]

为什么会这样?嗯,这是第一阶段。Python 在评估函数时,为append_two. 这意味着,如果你不传入一个列表,它总是会附加到那个列表中。该列表将随着时间的推移缓慢增长,因为越来越多2的 s 不断添加到其中。

原因是一致性。当你运行函数时,只有函数内部的东西会运行。函数内部没有任何地方说“创建一个新列表”,所以它没有。如果你想要它,你必须告诉它,像这样:

def append_two(a=None):
    if a is None:
        a = []  # Make a new list
    a.append(2)
    return a

这是笨重和烦人的,但这是你必须为一致性付出的代价。替代品更糟。


现在到你的主要问题。我会稍微简化一下。

class DemoClass:
    def __getitem__(self, index):
        return index
dataset = DemoClass()

style_clms = ["X", "Y"]
print(dataset[style_clms])

这打印['X', 'Y']。让我们看看dataset["X", "Y"]打印的内容:

>>> print(dataset["X", "Y"])
('X', 'Y')

好的...这称为tuple. list将 a 转换为 a很容易tuple

>>> print(dataset[tuple(style_clms)])
('X', 'Y')

万岁!我们已经成功地复制dataset["X", "Y"]了任意东西!:-) 这有望解决您的问题。


推荐阅读