python两个列表合成字典顺序问题

本文讲述了在使用Python处理列表和字典时遇到的顺序问题,特别是在Flask应用中。在尝试将hot标签与文章结合时,发现字典无法保持输入顺序。通过研究和搜索,了解到dict本身不记录输入顺序,而OrderedDict可以解决这一问题。最后,通过使用OrderedDict成功实现了列表元素与字典内容的同步并按预期顺序显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天师哥给指出了之前写的模块的某处修改,其实我当时也是发现知道那块问题是什么的,结果当时为了急于pull就暂时忽略了那问题。以后得注意同样的情况发生。

今天要修改的主要问题当时在解决前已明确指出:

1.推荐文章的第一个是图片显示
2.如何显示2,3,4,5的hot标志,也就是class标签
3.鼠标移动到title上会显示文章全标题

1和3问题还是挺容易解决了。

{% if choice.order==1 %}
  <li class="{{ hot }}">
      <a href="{{ url_for('consult.consult_detail',id=choice.choice_object.id) }}" title="{{ choice.choice_object.title }}">
          <img src="{{ static('consult/images/pic180px.jpg') }}" >
      </a>
  </li>
{% elif choice.order==2 or choice.order==3 %}
    ..........
第一个问题给html的模板里面添加if判断,因为推荐类的表中有order为int类型的属性,如果推荐的是第一篇,order==1,显示图片不显示标题。

<a href="{{ url_for('consult.consult_detail',id=choice.choice_object.id) }}" title="{{ choice.choice_object.title }}">
    <div style="width:120px; white-space:nowrap;overflow:hidden;text-overflow:ellipsis">
    {{ choice.choice_object.title }}
    </div>
</a>
第三个鼠标移动显示文本在<a>里面加上title,需要显示的内容即可。加这个功能的原因是,有的标题如果太长不好,所以就需要设置下显示固定长度的字数,上面的style中定义的属性就实现了这个功能。是在网上找的。但这次能很快找出来并使用,一个原因是之前有个地方尝试的用到,二是在实习项目日志里面之前也记录了就很方便的找到。

至于第二个问题,体会到真的有时解决问题的关键就在于灵光一闪。

到目前为止,在flask里面{%%}用的最多的就是for,if以及在href和src的{{}},哦还有显示获取数据的{{ XXXX }}。是真的脑子一转。

<li class="hot1"><a href="#"><img src="" ></a></li>
<li class="hot2"><a href="#">内训师技能提升</a></li>
<li class="hot3"><a href="#">内训师技能提升</a></li>
<li class="hot4">4<a href="#">内训师技能提升</a></li>
我是不是也可以把各种标签里面的属性也用路由获取的数据来表示呢。就类似于
<li class="{{ hot }}">

其实这种东西,越想越简单,就越觉得可以,而且事实也是这样的。

基于以上的突破点,目标就是把,举例的hot1,hot2,hot3,hot4在路由里面放在列表中,在模版里面用for迭代的使用就可以。

这时遇到的问题就是,我本来已经在for迭代推荐文章,这个从数据库XXXXDoc.objects.all()得到的数据是list。

如果再使用for就会引起html标签大量重复显示。所以,在经过一阵时间的思索搜查之后,字典得到了出场,而且一波两折,问题最终解决。若之后还有bug再说。

hots=['hot1','hot2','hot3','hot4']
dictionary=dict(zip(hots,choices))

for hot,choice in dictionary.items():
    print '%s,%s' % (hot, choice)
首先了解到可以使用zip和dict的结合使用来将两个列表的内容合成字典。本以为问题是解决了,打开界面看时发现顺序有点不对,这也是为什么我加了print打印测试的原因。

发现的问题是,就hots列表里面的四个值,我不论怎样在[]里面改变顺序,结果在合成字典之后,在print出来的顺序都是

hot4,XXXXXX

hot3,XXXXXX

hot2,XXXXXX

hot1,XXXXXX

直接导致显示出来的效果一直不对。我修改了hot3->hot,然后,顺序具体是什么我忘了,但第一个打印出来的一直是

hot,XXXXXX

..........

所以合并之后顺序就定好了一样,人为的无法控制。晚上在网上看到这样的解释,希望能帮助你和我。

dict是一种散列表结构,就是说数据输入后按特征已经被散列了,有自己的顺序.本身不记录原输入顺序.
如果一定需要输入顺序,建议
方案1,不使用dict,使用元组的列表,比如[('sam',''),('beta',''),('ccc',''),('abc','')]
这种结构是记录输入顺序的、有序的,也能方便地转换成dict.
方案2,另用一列表记录下输入时的顺序,比如['sam','beta','ccc','abc']

是找了半天我觉得很合适的解答。

在师哥的建议下就另找大致相同的思路,自己写列表放入定义的字典中,然后看到说有专门解决次问题的函数——OrderedDict。

hots = ['hot1', 'hot2', 'hot3', 'hot4','hot5','hot6','hot7','hot8']
index=0
dictionary=collections.OrderedDict()
for choice in choices:
    dictionary[hots[index]]=choice
    index=index+1
    if index==8:
        break
collection库里有这个OrderedDict真是极好的哟,反正我觉得就是能按列表里面从头开始的顺序,加入字典。

最终,其实一开始的上面那块代码都有,成功实现了标签class属性和内容的同步变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值