如何添加到元组

我有一个将 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>


长风秋雁
浏览 107回答 4
4回答

潇湘沐

您需要创建一个新的元组“详细信息”列表。在 Python 中,您通常无法“就地”更改列表。如果您只是在 for 循环中创建一个新的“详细信息”,它将不会传递到“详细信息”列表。因此,您需要用for detail in details:以下行替换完整的循环:updated_details&nbsp;=&nbsp;[(user,&nbsp;VoteChoice,&nbsp;Comments,&nbsp;User.query.filter_by(name=user).first().fb_pic) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(user,&nbsp;VoteChoice,&nbsp;Comments)&nbsp;in&nbsp;details]最后,您将这些更新的详细信息用于返回的 render_template:return&nbsp;render_template(...,&nbsp;vote_details=updated_details)

拉风的咖菲猫

元组是不可变的,因此您不能直接修改它们。在您的 for 循环中,从原始detail元组中创建一个列表,并将附加值附加到该列表中。然后,您可以将列表转换回元组:detail_list = list(detail)detail_list += [maybe_existing_user.fb_pic]detail = tuple(detail_list)

哈士奇WWW

使用 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')>>>&nbsp;

ABOUTYOU

您已经正确添加到元组中。问题是detail += ...创建一个新元组而不是附加到details列表中的现有元组(因为元组是不可变的)。当您print(detail)在循环中时,它似乎已正确更改,但如果您要打印整个列表details,您会看到其中的元组没有附加信息。一种解决方案是使用新元组重建详细信息列表。def add_more_info(t):&nbsp; &nbsp; maybe_existing_user = User.query.filter_by(name=detail[0]).first()&nbsp; &nbsp; 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:&nbsp; &nbsp; maybe_existing_user = User.query.filter_by(name=detail[0]).first()&nbsp; &nbsp; detail.append(maybe_existing_user)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python