【问题标题】:Variable who's reference is always to len(dict)变量 who 的引用始终是 len(dict)
【发布时间】:2014-04-03 14:36:26
【问题描述】:
cardPayments={}
rowNumber, NumOfCardPayments = 0, len(cardPayments)

for x in range(5):
    cardPayments.update({x:x})
    print(cardPayments)
    print('cardPayments: '+str(NumOfCardPayments)+'\n')

输出:

{0: 0}
cardPayments: 0

{0: 0, 1: 1}
cardPayments: 0

{0: 0, 1: 1, 2: 2}
cardPayments: 0

{0: 0, 1: 1, 2: 2, 3: 3}
cardPayments: 0

{0: 0, 1: 1, 2: 2, 3: 3, 4: 4}
cardPayments: 0

我希望通过将NumOfCardPayments 引用到len(cardPayments),随着cardPayments dict 的大小增加,在for 循环期间NumOfCardPayments 的int 值也会增加,但情况似乎并非如此。

如何将NumOfCardPayments 创建为作为len(cardPayments) 的引用维护的变量?

(请注意,我不想在 for 循环中简单地执行 NumOfCardPayments+=1

【问题讨论】:

  • 为什么不能每次都使用len(cardPayments)
  • 感谢 Tyler 的输入,这个问题并不是基于解决所提出问题的最简单方法,而是“如何以这种特定方式解决问题”。我同意,就示例而言,它可能不是最简化或最有效的,但我感兴趣的是对如何做到这一点的理解。
  • 别担心,这就是我问的原因。

标签: python dictionary increment variable-length


【解决方案1】:

想到的最接近的东西是一个属性,它在读取时自动评估一个函数:

>>> class LenDict(dict):
...   @property
...   def len(self):
...     return len(self)
...
>>> d=LenDict()
>>> d.len
0
>>> d[1]=2
>>> d.len
1
>>>

但是恕我直言,这并不比直接使用len(d) 更清楚,而且效率肯定不高。也可以通过包装 setitem 将钩子以相反的方式放置。

【讨论】:

    【解决方案2】:

    我认为这是不可能的。在 Python 中,变量包含指向对象的指针。整数对象是不可变的。因此,更改 numOfCardPayments 值的唯一方法是将其绑定到新对象...

    【讨论】:

    • @Robert:将变量绑定到新对象是通过赋值完成的。在使用NumOfCardPayments 之前,您需要每次都执行NumOfCardPayments = len(cardPayments)。每次都简单地使用len(cardPayments) 似乎更好。
    • 另一种选择是将numOfCardPayments替换为函数:def numOfCardPayments(): return len(cardPayments),然后使用numOfCardPayments()
    • 甚至可以使用属性隐藏函数。仍然没有比首先使用 len() 更具可读性。
    • Yann 你能举个例子吗?
    【解决方案3】:

    您可以创建一个简单的 lambda 对象来返回特定对象的长度

    def len_follower(target_object):
        return lambda : len(target_object)
    

    然后将参数target_object设置为cardPayments

    >>>cardPayments = {}
    >>>NumOfCardPayments = len_follower(cardPayments)
    >>>NumOfCardPayments()
    0
    >>>cardPayments[1] = 0
    >>>NumOfCardPayments()
    1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-23
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多