【问题标题】:update dictionary with dynamic keys and values in python用python中的动态键和值更新字典
【发布时间】:2012-12-01 08:29:00
【问题描述】:

我有一本字典,我想动态插入键和值,但我没能做到。问题是,当我使用更新方法时,它不会添加一对,但会删除以前的值,所以在打印字典时我只有最后一个值 这是我的代码

i = 0
for o in iterload(f):
    i=i+1
    mydic = {i : o["name"]}
    mydic.update({i : o["name"]})
    for k, v in mydic.items():
        print(k,v) 
print(mydic)

f 是我用 python 代码解析的文件 结果我得到了

{3: 'toto'}

这是最后一个元素。有没有办法让我的字典中的所有元素都包含在我的字典中

提前致谢

我还有一个问题

现在我需要检查输入值是否等于字典中的键,如果是,我需要获取该键的值以继续解析文件并获取其他信息。

这是我的代码:

f = open('myfile','r')
nb_name = input("\nChoose the number of the name :")

for o in iterload(f):
    if o["name"] == mydic[nb_name]: 
        ...

我得到一个 keyError

Traceback (most recent call last):
  File ".../test.py", line 37, in <module>
            if o["name"] == mydic[nb_name]: 
KeyError: '1'

我不明白这个问题

【问题讨论】:

    标签: python dictionary python-3.x key


    【解决方案1】:

    您可以使用len() 插入值:

    #!/usr/bin/python
    
    queue = {}
    
    queue[len(queue)] = {'name_first': 'Jon', 'name_last': 'Doe'}
    queue[len(queue)] = {'name_first': 'Jane', 'name_last': 'Doe'}
    queue[len(queue)] = {'name_first': 'J', 'name_last': 'Doe'}
    
    print queue
    

    【讨论】:

      【解决方案2】:

      @NPE pointed out the problem 在您的代码中(在每次迭代中重新定义字典)。

      这是另一种生成字典的方法(Python 3 代码):

      from operator import itemgetter
      
      mydict = dict(enumerate(map(itemgetter("name"), iterload(f)), start=1))
      

      关于KeyError: '1'input() 在 Python 3 中返回一个字符串,但字典 mydict 需要一个整数。要将字符串转换为整数,请调用int:

      nb_name = int(input("\nChoose the number of the name :"))
      

      【讨论】:

      • 为什么说这是python 3代码?我看不出它在 python 2 上失败的任何原因......虽然,我可能会写成:dict(enumerate((x['name'] for x in iterload(f)),start=1)),或者可能移动enumeratedict((i,x['name]) for i,x in enumerate(iterload(f),start=1))。我用生成器表达式替换了map。在 python3 中,这是同样的事情,但是这在 python3 和 python2 中会做同样的事情——而且我认为它更容易阅读。
      • @mgilson: map 在 Python 2 中返回一个列表。要使其成为 Python 2 代码,您可以添加 from itertools import imap as map。为了便于阅读,我会使用@NPE 答案中的字典理解。
      • 我知道 map 会在 py2k 中返回一个列表。但是代码可能仍然可以工作(除非文件很大)——在这种情况下,将数据存储在 dict 中也可能不起作用。 dict-comprehension 很好,但它要求 python2.7 最低限度。我的dict 版本试图满足一个快乐的媒介——行为类似于你的map 的生成器,但适用于python2.x 和恕我直言更容易阅读+ 使用dict 构造函数来创建字典一种与旧 python 版本兼容的方式。 (实际上它与 dict-comp 并没有太大区别)
      【解决方案3】:

      删除以下行:

          mydic = {i : o["name"]}
      

      并在循环之前添加以下内容:

      mydic = {}
      

      否则,您将在每次迭代中创建一个全新的单元素字典。

      还有以下内容:

      mydic.update({i : o["name"]})
      

      更简洁的写成

      mydic[i] = o["name"]
      

      最后,请注意,整个循环可以重写为字典推导:

      mydic = {i+1:o["name"] for i,o in enumerate(iterload(f))}
      

      【讨论】:

      • 您可以将start=1 传递给enumerate() 以匹配没有i+1 的问题中的代码
      猜你喜欢
      • 2015-09-23
      • 2018-11-11
      • 2021-07-28
      • 2021-03-15
      • 2016-02-20
      • 2017-04-25
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多