Python:在嵌套函数调用中应用列表

时间:2011-08-01 15:12:12

标签: python

我有两个def函数,我以嵌套方式调用,并希望在循环中调用第二个函数。我目前只能弄清楚如何手动调用我的列表的语法,而不是应用列表中的每个成员......

#A list of the files I want to read
afiles = [['awc_mm09c.txt','integer'], ['canopy01c.txt','real'],
                 ['canopy10c.txt','real'], ['canopy33c.txt','real'],
                 ['ccapnyp6c.txt','text'], ['gclass09c.txt','text'],
                 ['nyelev09c.txt','real']]

def readfile(fn):
    conn = open(ascPath + '\\' + fn, 'r')
    # code to read data from the file
def rows(*columns):
    # code that merges data from the other files into columns
    for ID, cols in enumerate(itertools.izip(*columns)):
        yield [ID] + list(cols)
# build the SQL
strQuery = "insert into foo...;"
# run some apsw (SQLite) code
c.execute("begin")
# this works. Is there any way to avoid manually listing each item in the list?
c.executemany(strQuery, rows(readfile(afiles[0][0]),
              readfile(afiles[1][0]),
              readfile(afiles[2][0]),
              readfile(afiles[3][0]),
              readfile(afiles[4][0]),
              readfile(afiles[5][0]),
              readfile(afiles[6][0])))
c.execute("commit")

#I've tried something like the following, but to no avail:

c.executemany(strQuery, rows(
    for f in range(len(afiles_dt)):
        readfile(afiles_dt[f][0])))

提前致谢。添

4 个答案:

答案 0 :(得分:1)

将呼叫替换为{/ 1}}

rows()

答案 1 :(得分:0)

你只需要在'for'之前移动'readfile(afiles [i] [0])' - 因为这是列表理解在python中的工作方式。您可以通过以下方式更新代码:

c.executemany(strQuery, rows(*[readfile(afiles[i][0]) for i in xrange(len(afiles_dt))]))

OR:

c.executemany(strQuery, rows(*[readfile(fInfo[0]) for fInfo in afiles_dt)]))

答案 2 :(得分:0)

rows(*map(lambda (n,t):readfile(n), afiles))

怎么样?

答案 3 :(得分:0)

试试这个:

c.executemany(strQuery, rows(
    *[readfile(afiles_dt[f][0]) for f in range(len(afiles_dt))]
))