我是编程和python的新手,我正在尝试使用这种语言创建一个模型。 在我的模型中,我将创建一个由一组家庭组成的社区。每个社区将是一个包含所有家庭的列表,每个家庭将是一个包含男性,女性,成员数量等的字典(因此将包括int和list)。所以会是这样的:
hh = {'num_members' : 0, #number members hshd
'list_male' : [] #list male members
'list_female' : [] #list female members}
在每个成员列表中,每个人的年龄都会在家庭中生存,例如,想象一个家庭有4个女性和3个男性,list_female就像list_female = [4,15,50] ,40],list_male = [45,30,13]和num_members = 7 该列表将在模型中随机创建并更新(人们将有孩子,死亡等)。
我想要做的是:如果成员数量(num_members)超过最大家庭规模,我会将家庭分成两个家庭,每个家庭包含一半的成员(随机定义),但我没有想法怎么做。我看到了一些划分字典的方法,但没有一个包含列表,所以我有点迷失。知道我怎么能这样做吗?
重要的一点是要记住,当我创建新家庭时,它将被纳入社区(并且每个家庭将被循环访问,对整个社区而言)
提前致谢
答案 0 :(得分:1)
把它分解成碎片,它们都很简单:
如果会员人数(num_members)超过最大家庭人数
if hh['num_members'] > max_household_size:
我将把家庭分成两个家庭
hh1, hh2 = {}, {}
每个包含列表中一半的成员(随机定义)
好的,让我们写一个函数来帮助解决这个问题:
def split_list(lst):
lst1 = []
lst2 = []
for member in lst:
if random.random() < 0.5:
lst1.append(member)
else:
lst2.append(member)
return lst1, lst2
现在,我们可以为男性调用一次该函数,对女性调用一次,并将所有结果重新收集到两个新的结果中:
hh1['list_female'], hh2['list_female'] = split(hh['list_female'])
hh1['list_male'], hh2['list_male'] = split(hh['list_male'])
hh1['num_members'] = len(hh1['list_male']) + len(hh1['list_female'])
hh2['num_members'] = len(hh2['list_male']) + len(hh2['list_female'])
有些方法可以让你更简洁,更聪明,但从你可以理解的代码开始,然后看看你是否可以从那里改进它而不会让自己感到困惑;不要先尝试写出最聪明的东西。
当然,您仍需要使用此hh1
和hh2
来确定做的内容,并且我确定您的问题的其他部分不是'琐碎的,但这应该足以让你解开。
答案 1 :(得分:0)
您可以根据您希望的最大家庭规模来设置条件语句,具体取决于您在最大列表中需要多少男性和女性。下面我有一个男性的例子。列表有一个名为.pop()的方法和另一个名为.append()的方法,我们可以在这个例子中使用它。 .pop()可以根据其列表从列表中删除指定的元素。索引位置。 .append()可以在空列表的末尾添加一个元素。如果超过最大家庭规模,我们可以从第一个列表中弹出指定数量的值。我们还可以使用范围函数从列表中选择我们想要pop()的人的范围,以便将列表分成两半,假设列表中的人数是偶数。如果是奇数,我们可以加1。
hh = {'num_members': 10,
'list_male': [30, 29, 17, 10, 15, 22, 19],
'list_female': [40, 70, 22],
}
if hh['num_members'] >= 10:
hh['list_male2'] = []
hh['list_female2'] = []
number = len(hh['list_male'])
number_female = len(hh['list_female'])
if number % 2 == 0:
divide_num = number / 2
divide_num = int(divide_num)
for person in range(0, divide_num + 1):
person = hh['list_male'].pop()
hh['list_male2'].append(person)
if number_female % 2 == 0:
divide_num_female = number_female / 2
divide_num_female = int(divide_num_female)
for person in range(0, divide_num_female + 1):
person = hh['list_female'].pop()
hh['list_female2'].append(person)
if number % 2 != 0:
number = number + 1
divide_num = number / 2
divide_num = int(divide_num)
for i in range(divide_num):
person = hh['list_male'].pop()
hh['list_male2'].append(person)
if number_female % 2 != 0:
number_female = number_female + 1
divide_num_female = number_female / 2
divide_num_female = int(divide_num_female)
for i in range(divide_num_female):
person = hh['list_female'].pop()
hh['list_female2'].append(person)
print(hh)
上面的代码将为您提供以下输出并将列表分成两半(基于我们在两个列表中的人数不均匀的事实,我们根据该不均匀的数字拆分列表):
{'num_members': 10, 'list_male': [30, 29, 17], 'list_female': [40], 'list_male2': [19, 22, 15, 10], 'list_female2': [22, 70]}
正如您所看到的,我们已经在字典中添加了其他列表,以根据成员数量超过最大限制的条件将成员拆分为两个单独的家庭。