在python中划分包含列表的字典

时间:2018-05-17 19:48:39

标签: python dictionary division

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

重要的一点是要记住,当我创建新家庭时,它将被纳入社区(并且每个家庭将被循环访问,对整个社区而言)

提前致谢

2 个答案:

答案 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'])

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

当然,您仍需要使用此hh1hh2来确定的内容,并且我确定您的问题的其他部分不是'琐碎的,但这应该足以让你解开。

答案 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]}

正如您所看到的,我们已经在字典中添加了其他列表,以根据成员数量超过最大限制的条件将成员拆分为两个单独的家庭。