【问题标题】:Editing values in python dictionary在 python 字典中编辑值
【发布时间】:2012-10-10 14:27:59
【问题描述】:

我有一个包含 1000 多个键的庞大字典,每个值都超过 600 000 int 长。现在,我需要提取其中一些整数,所以我想从 600 000 到 5k。但它不能是随机的 5k,它们必须在非常特定的位置。由于 5k 仍然有点太大而无法手动提取,我需要使用一个索引列表来指示应该取出值中的哪些整数。 我已经在小列表上测试了提取,索引 [1,3,5,7,9] 和 long_val ['a','b','c','d','e','f','g ','h','i','j','k'] 那么我可以这样做:

for each in xrange(len(long_val)):
    print indices[long_val[each]]

我得到 b、d、f、h 和 j(根据需要)。

现在,在处理字典(其中 long_val 被实际字典值替换)时,这并不那么简单。我试过了:

for keys,values in dict_gtps.iteritems():
    for each in xrange(len(values)):
        abs_new[keys]=pos_3[values[each]]

但我收到“索引超出范围”错误消​​息。

【问题讨论】:

    标签: python dictionary indexing extraction


    【解决方案1】:

    如果你使用相同的索引,使用itemgetter(*indices)会更有效

    >>> from operator import itemgetter
    >>> indices =  [1,3,5,7,9]
    >>> long_val = ['a','b','c','d','e','f','g','h','i','j','k'] 
    >>> ig = itemgetter(*indices)
    >>> ig(long_val)
    ('b', 'd', 'f', 'h', 'j')
    

    所以

    from operator import itemgetter
    ig = itemgetter(*indices)
    for k, v in dict_gtps.iteritems():
        print ig(v)
        abs_new[k] = ig(v)
    

    你也可以使用字典理解

    abs_new = {k:ig(v) for k,v in dict_gtps.iteritems()}
    

    【讨论】:

    • Ooo.. +1 用于字典理解变体。
    • itemgetter 的用处比列表理解稍差,因为它将新值放在一个元组中,我更喜欢将它们放在列表中。
    • @user1735184,改用list(ig(v))
    【解决方案2】:

    假设我正确阅读了您的要求,您可以尝试:

    for key, value in dict_gtps.iteritems():
      abs_new[key] = [value[i] for i in indices]
    

    【讨论】:

      【解决方案3】:

      您的示例代码有缺陷,indices 和 long_val 的值颠倒了。

       indices = [1,3,5,7,9]
       long_val = ['a','b','c','d','e','f','g','h','i','j','k']
       for each in xrange(len(long_val)):
          print indices[long_val[each]]
      

      抛出TypeError。应该是:

      indices = [1,3,5,7,9]
      long_val = ['a','b','c','d','e','f','g','h','i','j','k']
      for each in xrange(len(indices)):
          print long_val[indices[each]] 
      

      基于此,您的字典函数抛出范围错误的原因应该很明显,您输入了错误的变量。我会让你自己尝试修复代码。

      /为后代编辑 此外,由于索引中的值是整数,因此您实际上不需要使用 xrange--

      for i in indices:
          print long_val[i]
      

      简单得多。

      【讨论】:

      • 谢谢!我实际上调用了变量 a 和 b,然后混淆了这是什么......
      • @user1735184 我添加了对原始功能的简化。您可能希望在最终代码中对其进行迭代。
      猜你喜欢
      • 2023-03-20
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 2023-01-21
      • 2020-08-13
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多