为了账号安全,请及时绑定邮箱和手机立即绑定

如何添加到元组

如何添加到元组

长风秋雁 2022-07-26 17:05:15
我有一个将 3 个项目传递给 HTML 页面的元组,我希望它传递第四个。我已经在网上阅读了要做到这一点,我必须将我的元组变成一个列表,但我试过了,但仍然没有得到任何东西(没有错误,对象最后没有出现) . 所以为了清楚起见,我把它藏起来了。我正在尝试将“maybe_existing_user.fb_pic”添加到“详细信息”元组中。PYTHON@app.route('/results/<int:id>')def results(id):    rate = 0  # either 0 or num/total    article_list_of_one = Article.query.filter_by(id=id)    a_obj = article_list_of_one[0]    avs_obj = retrieve_article_vote_summary(a_obj.id) # vote_summary is a list of [tuples('True', numOfTrue), etc]    total_votes = avs_obj.getTotalVotes()    vote_choices = []    vote_choice_list = VoteChoice.getVoteChoiceList()    for item in vote_choice_list: # looping over VoteChoice objects        num = avs_obj.getVoteCount(item.choice)        if total_votes > 0:        # protecting against no votes            rate = num/total_votes         vote_choices.append([item.choice, item.color, num, rate*100, total_votes])    details = avs_obj.getVoteDetails() # 10/02 - retrieve array of tuples [(user, VoteChoice, Comments)]    print("Inside results(" + str(id) + "):")    details_count = 0    for detail in details:        maybe_existing_user = User.query.filter_by(name=detail[0]).first()        detail += (maybe_existing_user.fb_pic,)        print(detail)        #print("    " + str(details_count) + ": " + details[0] + " " + details[1] + " " + details[2])        details_count += 1    return render_template('results.html', title=a_obj.title, id=id,                           image_url=a_obj.image_url, url=a_obj.url,                           vote_choices=vote_choices, home_data=Article.query.all(),                           vote_details=details)HTML<!DOCTYPE html><html><body>{% for detail in vote_details %}<strong>User:</strong> {{ detail[0] }} &nbsp; <strong>Vote:</strong> {{ detail[1] }} &nbsp; <strong>Comments:</strong> {{ detail[2] }}<br>{{ detail[3] }}{% endfor %}</body></html>
查看完整描述

4 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

您需要创建一个新的元组“详细信息”列表。在 Python 中,您通常无法“就地”更改列表。如果您只是在 for 循环中创建一个新的“详细信息”,它将不会传递到“详细信息”列表。

因此,您需要用for detail in details:以下行替换完整的循环:

updated_details = [(user, VoteChoice, Comments, User.query.filter_by(name=user).first().fb_pic)
                   for (user, VoteChoice, Comments) in details]

最后,您将这些更新的详细信息用于返回的 render_template:

return render_template(..., vote_details=updated_details)


查看完整回答
反对 回复 2022-07-26
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

元组是不可变的,因此您不能直接修改它们。


在您的 for 循环中,从原始detail元组中创建一个列表,并将附加值附加到该列表中。然后,您可以将列表转换回元组:


detail_list = list(detail)

detail_list += [maybe_existing_user.fb_pic]

detail = tuple(detail_list)


查看完整回答
反对 回复 2022-07-26
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

使用 splat 操作符在一行中重新打包


detail_list = *detail_list, maybe_existing_user.fb_pic

例如,在 python3 shell 中:


>>> detail_list = ("cat", "dog")

>>> detail_list = *detail_list, "rabbit"

>>> detail_list

('cat', 'dog', 'rabbit')

>>> 


查看完整回答
反对 回复 2022-07-26
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

您已经正确添加到元组中。问题是detail += ...创建一个新元组而不是附加到details列表中的现有元组(因为元组是不可变的)。当您print(detail)在循环中时,它似乎已正确更改,但如果您要打印整个列表details,您会看到其中的元组没有附加信息。


一种解决方案是使用新元组重建详细信息列表。


def add_more_info(t):

    maybe_existing_user = User.query.filter_by(name=detail[0]).first()

    return t + (maybe_existing_user, )


details = [add_more_info(detail) for detail in details]

另一种解决方案是首先将所有详细信息转换为列表。然后你可以附加到它们。


details = [list(detail) for detail in details]

for detail in details:

    maybe_existing_user = User.query.filter_by(name=detail[0]).first()

    detail.append(maybe_existing_user)


查看完整回答
反对 回复 2022-07-26
  • 4 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信