首页 > 解决方案 > 是否有可能在已知值之前将 namedtuple 的新实例推入字典?

问题描述

对我来说,第 9 行似乎出了问题。在这里,我希望将 TagsTable 的新副本推送到字典中。我知道一旦记录了命名元组字段,就无法更改它。但是,结果让我感到困惑,因为看起来值确实发生了变化 - 当此代码退出 mp3_tags 的所有条目时[三个字典键中的任何一个].date 设置为“1999_03_21”的最后日期

所以,两个问题:

  1. 有没有办法将新的 TagsTable 推送到字典中?

  2. 为什么代码不会失败并且不允许将第二个(甚至第三个)日期写入 TagsTable.date 字段(因为它似乎是对同一个 namedtuple 的引用)?我以为你不能写第二个值?

从集合导入命名元组
2 TagsTable = namedtuple('TagsTable',['title','date','subtitle','artist','summary','length','duration','pub_date'])
3 个 mp3 文件 = ['42-001.mp3','42-002.mp3','42-003.mp3']
4 个日期 = ['1999_01_07', '1999_02_14', '1999_03_21']
5   
6 mp3_tags = {}
7   
8 用于 mp3files 中的 mp3file:
9 mp3_tags[mp3file] = 标签表
10  
11 for mp3file,date_string in zip(mp3files,dates):
12 mp3_tags[mp3file].date = date_string
13      
14 用于 mp3files 中的 mp3file:
15 打印(mp3_tags[mp3file].date)

标签: dictionarypython-3.6namedtuple

解决方案


看起来这是我正在寻找的修复:

from collections import namedtuple

mp3files = ['42-001.mp3','42-002.mp3','42-003.mp3']
dates = ['1999_01_07', '1999_02_14', '1999_03_21']

mp3_tags = {}

for mp3file in mp3files:      
   mp3_tags[mp3file] = namedtuple('TagsTable',['title','date','subtitle','artist','summary','length','duration','pub_date'])

for mp3file,date_string in zip(mp3files,dates):
      mp3_tags[mp3file].date = date_string

for mp3file in mp3files:
      print( mp3_tags[mp3file].date )

推荐阅读