目标是找出家庭是否平衡。例如,我们有以下两个数组:
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个孩子,而这些孩子有孩子。如果我们添加他们的金额,我们将获得相同的价值。
- matjaž(142)
- Viljem(55)
- Tadeja(45)sum = 242
- Viljem(55)
- 西尔卡(242)
- 没有孩子sum = 242
- 丹尼尔(4)
- 伊丽莎白(8)
- ludvik(37)
- Jurij(5)
- 法郎(16)
- Jožef(7)
- Alenka(3)
- Aleksander(3)
- 佩特拉(3)
- 芭芭拉(37)
- 汉斯(55)
- 赫尔曼(12)
- 玛格丽塔(20)
- 埃里克(32)sum = 242
- 赫尔曼(12)
- 伊丽莎白(8)
所有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
可以工作。