包含 python 中列表的划分字典
Dividing dictionary that contain lists in 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)超过最大家庭人数我会把这个家庭分成两个家庭,每个家庭包含一半的列表成员(随机定义), 但我不知道该怎么做。我看到了一些划分字典的方法,但是 none 包含一个涉及的列表,所以我有点迷路了。知道我该怎么做吗?
需要记住的一点是,当我创建新家庭时,它将包含在社区中(并且每个家庭将被循环访问,对于整个社区)
提前致谢
分解成小块,它们都很简单:
if the number of members (num_members) exceed the max household size
if hh['num_members'] > max_household_size:
I will divide the household into two households
hh1, hh2 = {}, {}
each containing half of the members of the lists (define randomly)
好的,让我们编写一个函数来帮助解决这个问题:
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
做什么,我相信还有其他部分你的问题不是微不足道的,但这应该足以让你摆脱困境。
您可以根据您希望的最大家庭人数,以及您希望最大列表中的男性和女性数量来设置条件语句。下面我有一个男性的例子。列表有一个名为 .pop() 的方法和另一个名为 .append() 的方法,我们可以在这个例子中使用它们。 .pop() 可以根据其索引位置从列表中删除指定元素。 .append() 可以将一个元素添加到空列表的末尾。如果超过最大家庭人数,我们可以从第一个列表中弹出指定数量的值。我们还可以使用 range 函数 select 我们想要从列表中 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]}
如您所见,我们在字典中添加了额外的列表,根据成员数量超过最大限制的条件将成员分成两个独立的家庭。
我是编程和 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)超过最大家庭人数我会把这个家庭分成两个家庭,每个家庭包含一半的列表成员(随机定义), 但我不知道该怎么做。我看到了一些划分字典的方法,但是 none 包含一个涉及的列表,所以我有点迷路了。知道我该怎么做吗?
需要记住的一点是,当我创建新家庭时,它将包含在社区中(并且每个家庭将被循环访问,对于整个社区)
提前致谢
分解成小块,它们都很简单:
if the number of members (num_members) exceed the max household size
if hh['num_members'] > max_household_size:
I will divide the household into two households
hh1, hh2 = {}, {}
each containing half of the members of the lists (define randomly)
好的,让我们编写一个函数来帮助解决这个问题:
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
做什么,我相信还有其他部分你的问题不是微不足道的,但这应该足以让你摆脱困境。
您可以根据您希望的最大家庭人数,以及您希望最大列表中的男性和女性数量来设置条件语句。下面我有一个男性的例子。列表有一个名为 .pop() 的方法和另一个名为 .append() 的方法,我们可以在这个例子中使用它们。 .pop() 可以根据其索引位置从列表中删除指定元素。 .append() 可以将一个元素添加到空列表的末尾。如果超过最大家庭人数,我们可以从第一个列表中弹出指定数量的值。我们还可以使用 range 函数 select 我们想要从列表中 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]}
如您所见,我们在字典中添加了额外的列表,根据成员数量超过最大限制的条件将成员分成两个独立的家庭。