【问题标题】:Variable in python dictionarypython字典中的变量
【发布时间】:2018-03-02 21:38:13
【问题描述】:

我有这本词典:

A = {"a": 1, "b":2}

我想写一个变量,而不是上面的初始化,而不是 2,它是 a 值的 4 倍,如果 a 的值发生变化,它就会更新。

我不能这样做:

A={"a": 1, "b": 4*A["a"]}

我该如何处理?

‡:在我的代码中,

flight = {
    "dest": "".join(random.choice(string.ascii_uppercase) for n in xrange(3)),
    "from": "".join(random.choice(string.ascii_uppercase) for n in xrange(3)),
    "not_available_seats": [],
    "available_seats": 50,
    "uid": uid,
    #"price": 10,
    "date": datetime.datetime.now()
}
flight["price"] = lambda: (51 - flight["available_seats"])*10

所以当打印 flight() 时,我得到了错误。

【问题讨论】:

  • 如果我没记错的话,{} 内的A 还不存在,所以A["a"] 没有意义。
  • 您编辑了问题,但现在很混乱。如果您使用静态值初始化 A ,然后尝试使用动态值重新初始化它(如您的问题中所反映的那样),它将正常工作。如果您只尝试以自引用方式对其进行初始化,那么它将不起作用(请参阅@jpp 的链接)。
  • 你能做两个作业吗?即A={"a": 1}; A["b"]=4*A["a"];。此时,A 存在,并且包含一个带有值的 "a" 键。
  • @jpp 我也闻到了XY problem

标签: python dictionary


【解决方案1】:

使用 lambda 函数,然后在需要正确值时调用 A["b"]

>>> A={"a": 1}
>>> A["b"]= lambda: 4*A["a"]
>>> A["b"]()
4
>>> A["a"] = 5
>>> A["b"]()
20

针对A["a"] 是列表的情况进行了更新:

>>> A={"a": [1,2,3,4,5]}
>>> A["b"]= lambda: [4*i for i in A["a"]]
>>> A["b"]()
[4, 8, 12, 16, 20]

【讨论】:

  • 我对这个实现的问题是,虽然语法很好(“只需在字典调用后添加()”),但实际上字典并没有存储值本身。每次都必须重新计算。我发布了一个面向对象的解决方案,我认为它更适合这个问题。
  • @jpp 哦,我同意,总体问题最好通过 OOP 解决方案来解决。绝对是XY问题。为您的方法 +1!
【解决方案2】:

我越是关注这个问题,我就越相信你想要一个面向对象的解决方案。

这是一种实现方式:

import random, string
from datetime import datetime

class Flight(object):

    def __init__(self, dest, origin, not_available_seats, available_seats, uid, date):
        self.dest = dest
        self.origin = origin
        self.not_available_seats = not_available_seats
        self.available_seats = available_seats
        self.uid = uid
        self.date = date
        self.price = (51 - self.available_seats) * 10

    def set_available_seats(self, available_seats):
        self.available_seats = available_seats
        self.price = (51 - self.available_seats) * 10
        return None

您可以像添加字典项一样轻松地创建类实例:

F1 = Flight("".join(random.choice(string.ascii_uppercase) for n in range(3)),
            "".join(random.choice(string.ascii_uppercase) for n in range(3)),
            [],
            50,
            123456789,
            datetime.now())

更新可用座位会导致价格更新:

print(F1.price)              # 10
F1.set_available_seats(30)
print(F1.price)              # 210

【讨论】:

  • 谢谢,这太棒了,也是我想要的!
猜你喜欢
  • 2021-10-02
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
  • 1970-01-01
相关资源
最近更新 更多