Разделительный словарь, содержащий списки в Python - PullRequest
0 голосов
/ 17 мая 2018

Я новичок в программировании и в 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 голосов
/ 17 мая 2018

Вы можете установить условные выражения в зависимости от того, какой максимальный размер вашей семьи вы хотите, и в зависимости от того, сколько мужчин и женщин вы хотите в максимальном списке.Ниже у меня есть пример для мужчин.Списки имеют метод .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]}

Как вы можете видеть, мы добавили дополнительные списки в словарь, чтобы разделить членов на две отдельные семьи, исходя из условия, что числоучастники превышают максимальный лимит.

0 голосов
/ 17 мая 2018

Разбейте его на части, и все будет просто:

, если число членов (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, и я уверен, что естьдругие части вашей проблемы, которые не являются тривиальными, но этого должно быть достаточно, чтобы вы отклеились.

...