使用生成器/列表推导获得此输出?

时间:2014-04-20 19:02:57

标签: python generator list-comprehension web.py

我对某些事情有点麻烦,而且我不知道如何做到这一点。

好吧,我正在创建一个带有按钮的动态表单,这些按钮可以适应目录中有多少文件(在本例中为电影)。

到目前为止我已经知道了:

path="C:\\Users\\User\\Desktop\\test\\"  # insert the path to the directory of interest
movies = []
dirList=os.listdir(path)

for fname in dirList: # loops through directory specified
    print fname # prints file name
    movies.append(fname) # adds the file name to list

my_form = form.Form([form.Button("btn", id="btn" + movies[i], value = i, html=movies[i], class_="btn" +movies[i]) for i in range(len(movies))]) 

但是,我希望列表理解/生成器使my_form看起来像这样:

my_form = form.Form(
    form.Button("btn", id="btnA", value="A", html="Movie1", class_="btnA")
    form.Button("btn", id="btnB", value="B", html="Movie2", class_="btnB")
)

正如您所看到的,不是电影名称是ID,而是btnAbtnB

那我怎么能产生那个输出呢?

2 个答案:

答案 0 :(得分:1)

我想你想做点什么:

from string import ascii_uppercase

buttons = [form.Button("btn", id="btn{0}".format(char), value=char, 
                       html=movie, class_="btn{0}".format(char))
           for char, movie in zip(ascii_uppercase, movies)]

my_form = form.Form(buttons)

这会使用string.ascii_uppercase中的字母标记movies中的每个项目。

答案 1 :(得分:1)

如果我理解正确,你希望根据电影的索引将id设为btn +一个字母?

您可以使用此代码:

def letterForIndex(idx):
    return chr(ord('A')+idx)

所以你会这样做:

 my_form = form.Form([form.Button("btn", id="btn" + letterForIndex(i),
 value = letterForIndex(i), html=movies[i], class_="btn" +letterForIndex(i)) for i in range(len(movies))])