如果家庭不平衡,如何编写功能以获取



目标是找出家庭是否平衡。例如,我们有以下两个数组:

kids= {
"Adam": ["Matjaž", "Cilka", "Daniel"],
"Aleksander": [],
"Alenka": [],
"Barbara": [],
"Cilka": [],
"Daniel": ["Elizabeta", "Hans"],
"Erik": [],
"Elizabeta": ["Ludvik", "Jurij", "Barbara"],
"Franc": [],
"Herman": ["Margareta"],
"Hans": ["Herman", "Erik"],
"Jožef": ["Alenka", "Aleksander", "Petra"],
"Jurij": ["Franc", "Jožef"],
"Ludvik": [],
"Margareta": [],
"Matjaž": ["Viljem"],
"Petra": [],
"Tadeja": [],
"Viljem": ["Tadeja"],
}

孩子们的阵列告诉您,谁的家人是谁的孩子。(这是一个全局数组)

money= {
        "Adam": 42,
        "Aleksander": 3,
        "Alenka": 3,
        "Barbara": 37,
        "Cilka": 242,
        "Daniel": 4,
        "Erik": 32,
        "Elizabeta": 8,
        "Franc": 16,
        "Herman": 12,
        "Hans": 55,
        "Jožef": 7,
        "Jurij": 5,
        "Ludvik": 37,
        "Margareta": 20,
        "Matjaž": 142,
        "Petra": 3,
        "Tadeja": 45,
        "Viljem": 55
    }

钱阵列告诉你每个人都有多少钱。

我们有此功能:

def balanced(person, money):
   #should return true if the family is balanced or not, if not returns false

例如:我们调用函数:

balanced("Adam", money)

它应该返回true,因为亚当有3个孩子,而这些孩子有孩子。如果我们添加他们的金额,我们将获得相同的价值。

  1. matjaž(142)
    • Viljem(55)
      • Tadeja(45)sum = 242
  2. 西尔卡(242)
    • 没有孩子sum = 242
  3. 丹尼尔(4)
    • 伊丽莎白(8)
      • ludvik(37)
      • Jurij(5)
        • 法郎(16)
        • Jožef(7)
          • Alenka(3)
          • Aleksander(3)
          • 佩特拉(3)
      • 芭芭拉(37)
    • 汉斯(55)
      • 赫尔曼(12)
        • 玛格丽塔(20)
      • 埃里克(32)sum = 242

所有3个孩子都将总货币价值返回242,并且因为所有3个孩子都这样做,它作为一个平衡的家庭返回。

我已经写了一个功能来计算家庭成员及其后代的钱:

def amount_of_money(person, money):
    amount = 0
    for kid in kids[person]:
        amount += amount_of_money(kid, money)
    return amount + money[person]

现在,如果发生这种情况,我将如何编写函数balanced返回true?

因此,我们要使用您已经拥有的功能首先生成所有孩子的钱(和那里的孩子)的list。我们可以使用comprehension

然后,我们可以在generator上使用all()检查孩子的所有钱是否相同(即,它是 em> balanced )。

总的来说,功能归结为2行:

def balanced(person, money):
    kidsMoney = [amount_of_money(k, money) for k in kids[person]]
    return all(m == kidsMoney[0] for m in kidsMoney)

确实有效:

>>> balanced("Adam", money)
True

检查家庭金额最多是否有一个?

def balanced(person, money):
    return len({amount_of_money(kid, money) for kid in kids[person]}) <= 1

您已经完成了amount_of_money()中的大部分繁重举重。对于balanced(),您可以使用:

def balanced(person, money):
    kid_amounts = [amount_of_money(kid, money) for kid in kids[person]]
    return len(set(kid_amounts)) <= 1

我们使用列表理解来获取每个孩子所拥有的所有款项。然后,我们从这些数量中创建一个集合,看看它有多长时间。如果所有金额相同,则集合的长度将为1(因为集合只能具有唯一的值)。假设没有孩子的人将被视为"平衡",我们还将接受一个空的(或列表)。因此,当金额相同或没有金额时,<= 1可以工作。

最新更新