包含 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'])

有很多方法可以使它更简洁或更聪明,但是从您绝对可以理解的代码开始,然后看看您是否可以从那里改进它而不会让自己感到困惑;不要试图先写最聪明的东西。

当然你还需要弄清楚用这个hh1hh2做什么,我相信还有其他部分你的问题不是微不足道的,但这应该足以让你摆脱困境。

您可以根据您希望的最大家庭人数,以及您希望最大列表中的男性和女性数量来设置条件语句。下面我有一个男性的例子。列表有一个名为 .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]}

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