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。