划分包含 python 中列表的字典



我是编程和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)超过最大家庭规模,我将家庭分为两个家庭,每个家庭包含列表成员的一半(随机定义),但我不知道该怎么做。我看到了一些划分字典的方法,但没有一种包含涉及的列表,所以我有点迷茫。知道我该怎么做吗?

要记住的一点是,当我创建新家庭时,它将被包含在社区中(并且每个家庭都将在一个循环中访问,用于整个社区)

提前致谢

把它分解成几个部分,它们都很容易:

如果成员人数(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'])

有一些方法可以使它更简洁,或更聪明,但从你绝对可以理解的代码开始,然后看看你是否可以从那里改进它而不会混淆自己;不要试图先写最聪明的东西。

当然,您仍然需要弄清楚如何处理此hh1hh2,我相信您的问题还有其他部分并非微不足道,但这应该足以让您摆脱困境。

您可以设置条件语句,具体取决于您希望最大家庭规模是多少,以及您希望在最大列表中有多少男性和女性。下面我举一个男性的例子。列表有一个名为 .pop() 的方法和另一个称为 .append() 的方法,我们可以在本例中使用。.pop() 可以根据其索引位置从列表中删除指定的元素。.append() 可以将元素添加到空列表的末尾。如果超过最大家庭人数,我们可以从第一个列表中弹出指定数量的值。我们还可以使用 range 函数从列表中选择我们要 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]}

如您所见,我们在字典中添加了额外的列表,以根据成员数量超过最大限制的条件将成员分成两个单独的家庭。

最新更新