python编写中的动态参数
我正在尝试构建一个函数,该函数根据传入的列号动态删除和排序行。到目前为止,我已经定义了以下内容:python编写中的动态参数,python,csv,Python,Csv,我正在尝试构建一个函数,该函数根据传入的列号动态删除和排序行。到目前为止,我已经定义了以下内容: import csv def delete(rows_to_keep): with open('file.csv','r') as source: rdr= csv.reader( source ) with open('reordered.csv','w') as result: wtr= csv.writer( result, d
import csv
def delete(rows_to_keep):
with open('file.csv','r') as source:
rdr= csv.reader( source )
with open('reordered.csv','w') as result:
wtr= csv.writer( result, delimiter=',', lineterminator='\n' )
for r in rdr:
wtr.writerow( ... )
rows_to_keep = [1, 3, 5, 6]
delete(rows_to_keep)
然而,在上面,我想。。。在writerow(…)中,要替换为参数,如下所示:
... = r[1], r[3], r[5], r[6]
i、 e
并根据传入的内容更改参数的数量和顺序
如果数组突然有10个值,我不太确定我怎么能做到这一点。有什么想法吗?使用
行将保持在一个循环中,以创建一个包含您要写出的新值序列的列表。然后将该列表传递给writerow()
;它不接受任意数量的参数,因此您必须以某种方式使用列表调用它。大概是这样的:
rows_to_keep = [1, 3, 5, 6]
...
for row in rdr:
newrow = list()
for n in rows_to_keep:
newrow.append(row[n])
wtr.writerow(newrow)
如果你愿意,也可以使用理解。相同的结果(如果使用正确)
使用rows\u将
保持在一个循环中,以构建一个包含要写出的新值序列的列表。然后将该列表传递给writerow()
;它不接受任意数量的参数,因此您必须以某种方式使用列表调用它。大概是这样的:
rows_to_keep = [1, 3, 5, 6]
...
for row in rdr:
newrow = list()
for n in rows_to_keep:
newrow.append(row[n])
wtr.writerow(newrow)
如果你愿意,也可以使用理解。相同的结果(如果使用正确)
您可以使用列表:
wtr.writerow([r[col] for col in rows_to_keep])
您可以使用列表:
wtr.writerow([r[col] for col in rows_to_keep])
也许您的意思是columns\u to\u keep
并将要保留的列列表作为列表传递给函数。您可以在此处使用操作符.itemgetter
import csv
import operator
def prune_columns(columns_to_keep):
with open('file.csv', 'r') as source,\
open('reordered.csv','w') as result:
rdr = csv.reader( source )
wtr = csv.writer(result, delimiter=',', lineterminator='\n' )
select = operator.itemgetter(*columns_to_keep)
# select is now a function that returns a tuple that
# returns elements 1, 3, 5 and 6 of the input
for row in rdr:
wtr.writerow(select(row))
prune_columns(columns_to_keep=[1, 3, 5, 6])
也许您的意思是columns\u to\u keep
并将要保留的列列表作为列表传递给函数。您可以在此处使用操作符.itemgetter
import csv
import operator
def prune_columns(columns_to_keep):
with open('file.csv', 'r') as source,\
open('reordered.csv','w') as result:
rdr = csv.reader( source )
wtr = csv.writer(result, delimiter=',', lineterminator='\n' )
select = operator.itemgetter(*columns_to_keep)
# select is now a function that returns a tuple that
# returns elements 1, 3, 5 and 6 of the input
for row in rdr:
wtr.writerow(select(row))
prune_columns(columns_to_keep=[1, 3, 5, 6])
如果我理解正确的话,writerow(*[r[col]for col in rows\u to_keep])
实际上是合适的,因为它与“wtr.writerow(r[1],r[3],r[5],r[6])
”具有多个参数的@EOL:writerow()
是一个语法错误。但是是的,在理解中应该是r[col]
。@alexis即使问题中想要的表达是不正确的,我仍然坚持我的评论,这可以说是正确的。请注意,从技术上讲,这些表达式不会产生语法错误,而是类型错误(语法没有问题)。如果我正确理解了这个问题,writerow(*[r[col]for col in rows\u to\u keep])
实际上是合适的,以便与“wtr.writerow(r[1],r[3],r[5],r[6])
”具有相同的效果。不完全正确,带有多个参数的@EOL:writerow()
是一个语法错误。但是是的,在理解中应该是r[col]
。@alexis即使问题中想要的表达是不正确的,我仍然坚持我的评论,这可以说是正确的。请注意,从技术上讲,表达式不会产生语法错误,而是产生类型错误(语法没有问题)。另外,在第一个示例中,list()
通常被简单地写成[]
。理解力很强,但新程序员很难理解。因为这不是问题的核心,所以我选择保持简单明了。我总是用一个列表来理解:这就是他们的目的。另外,在第一个示例中,list()
通常被简单地写成[]
。理解力很强,但新程序员很难理解。因为这不是问题的核心,所以我选择保持简单明了。YMMV。