как передать и получить доступ к списку в качестве параметра в Python - PullRequest
0 голосов
/ 18 октября 2018

Давайте рассмотрим следующий пример кода:

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:) и получить к нему доступ по адресу "dataset[style_clms] "(B:)?(теперь он становится равным [['X', 'Y']], но я хочу ['X', 'Y'], то есть стал вложенным списком)

Кроме того, хорошо ли задавать список в качестве параметра "по умолчанию" (C:) в определении функции?Если не так, то любой альт.способы достичь этого?Из-за Pylint выдает предупреждение типа " Опасное значение по умолчанию [] в качестве аргумента "

Есть идеи?Спасибо,

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Это [] значение по умолчанию привлекает внимание многих людей, поэтому я расскажу об этом в первую очередь.Когда 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.

Причина этого - последовательность.Когда вы запускаете функцию, запускается только содержимое внутри функции.Нигде внутри функции не написано «создать новый список», поэтому это не так.Если вы хотите, вы должны сказать это следующим образом:

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 в tuple:

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

Ура!Мы успешно реплицировали dataset["X", "Y"] для произвольных вещей!:-) Надеюсь, это решит вашу проблему.

0 голосов
/ 18 октября 2018

Просто сведите список с помощью этого:

import itertools
flat_list = list(itertools.chain(*list2d))

или

flat_list = [item for sublist in l for item in sublist]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...