使用* args调用python函数未定义次数

时间:2014-06-05 14:16:56

标签: python

我定义了一个函数createDictionary,它接受​​一个文件,从该文件中提取密钥并使用这些密钥从矩阵中索引数据值。然后返回,并将索引用作键,并将值作为python词典中的值检索。

我的目标是编写一个getData函数,根据用户传递给它的矩阵和其他args的数量,调用并运行createDictionary一定次数。我想要做的更多手动版本如下。

def getData(bedfile, matrix1, start1, end1, matrix2, start2, end2, matrix3, start3, end3, bedfilesep = "\t", matrixsep = "\t"):
    x = createDictionary(bedfile, matrix1, start1, end1, bedfilesep, matrixsep)
    y = createDictionary(bedfile, matrix2, start2, end2, bedfilesep, matrixsep)
    z = createDictionary(bedfile, matrix3, start3, end3, bedfilesep, matrixsep)

    x.update(y)
    x.update(z)

    return x.values()

理想情况下,我可以传递任意数量的matrix#start#end#参数,并针对此类事件的出现次数运行此函数。

3 个答案:

答案 0 :(得分:1)

实际上你想要使用不同的数据结构。 每当你发现自己定义x1,x2,x3 ...... x913等时,请考虑使用列表!

函数看起来像这样:

def getData(bedfile, matrixlist, bedfilesep = "\t", matrixsep = "\t"):
  x = createDictionary(bedfile, matrixlist[0][0], matrixlist[0][1], matrixlist[0][2], bedfilesep, matrixsep)
  y = createDictionary(bedfile, matrixlist[1][0], matrixlist[1][1], matrixlist[1][2], bedfilesep, matrixsep)
  z = createDictionary(bedfile, matrixlist[2][0], matrixlist[2][1], matrixlist[2][2], bedfilesep, matrixsep)
  ...

你需要将你的矩阵打包到列表中,例如将它们存储在元组中:

mylist = []
mylist.append((m1, s1, e1))
mylist.append((m12, 12, 33))

然后你可以通过调用

立即传递整个列表
getData(bedfile, mylist)

答案 1 :(得分:0)

考虑将它们作为矩阵,开始和结束的三个单独列表或三者中的三元组三元组列表传递。然后使用for循环或列表推导来为它们的每一组运行。 对于无序的异构参数列表使用* args ** kwargs似乎并不理想。

答案 2 :(得分:0)

它应该像将参数作为list传递一样简单,所以

getData(bedfile, matrix1, ... , matrix2, ...)

会变成

getData(bedfile, [matrix1, matrix2], ....)

然后在getData函数中,您可以将其作为

进行处理
x = {}
for matrix, start, end in zip(matrices, starts, ends):
    x.update(createDictionary(bedfile, matrix, start, end, bedfilesep, matrixsep)