python - 如何在 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 ”的警告
有任何想法吗?谢谢,
解决方案
那个[]
-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"]
了任意东西!:-) 这有望解决您的问题。
推荐阅读
- winforms - WinForm 中的支票簿设计器
- html - 如何在angular js中获取月份的下拉并将默认值设置为当前月份(也是年份)?
- html - 如何做一个全屏背景滚动组件
- flutter - 如何在颤动中调整或调整可拖动组件的大小?
- c++ - GCC 中的库连接
- javascript - 如何使用 shadow-dom Web 组件实现一致的焦点轮廓颜色?
- sql-server - 带有变量的数据流问题中的 OLE DB 源
- sql - 如何从复杂条件下的表中选择值?
- spring-boot - spring-boot-starter-data-jpa 插入查询不将数据保存在数据库中
- php - 是否可以在 wordpress 管理面板中将上一个/下一个分页更改为编号分页?