Моя функция, которая создает словарь из списка, повторяет значения три раза, а не один раз - PullRequest
0 голосов
/ 25 марта 2020

Итак, у меня есть функция, которая должна принимать список из 10 лучших имен детей 1980-1984 годов и пустой словарь в качестве аргументов, и она должна возвращать словарь с именем в качестве ключа и список списков с частота, пол и год как значения.

Список данных выглядит примерно так:

  ...[1, 'Christopher', 741, 'Boy', 1984],
  [2, 'Michael', 674, 'Boy', 1984],
  [3, 'Matthew', 630, 'Boy', 1984],
  [4, 'Ryan', 598, 'Boy', 1984],
  [5, 'Daniel', 459, 'Boy', 1984],
  [6, 'David', 413, 'Boy', 1984],
  [7, 'Jason', 399, 'Boy', 1984],
  [8, 'Andrew', 343, 'Boy', 1984],
  [8, 'Robert', 343, 'Boy', 1984],
  [10, 'Kyle', 331, 'Boy', 1984],
  [1, 'Jennifer', 705, 'Girl', 1980],
  [2, 'Amanda', 551, 'Girl', 1980],
  [3, 'Melissa', 316, 'Girl', 1980],
  [4, 'Lisa', 290, 'Girl', 1980],
  [5, 'Sarah', 284, 'Girl', 1980],
  [6, 'Michelle', 281, 'Girl', 1980],
  [7, 'Nicole', 252, 'Girl', 1980],
  [8, 'Erin', 249, 'Girl', 1980],
  [9, 'Angela', 215, 'Girl', 1980],
  [10, 'Heather', 191, 'Girl', 1980],
  [10, 'Kimberly', 191, 'Girl', 1980],...

Ожидаемый вывод должен быть:

{ 'Amanda': [ [551, 'Girl', 1980],
          [[486, 'Girl', 1981]],
          [[567, 'Girl', 1982]],
          [[480, 'Girl', 1983]],
          [[457, 'Girl', 1984]]...

Мой фактический вывод:

{ 'Amanda': [ [551, 'Girl', 1980],
          [[486, 'Girl', 1981]],
          [[567, 'Girl', 1982]],
          [[480, 'Girl', 1983]],
          [[457, 'Girl', 1984]],
          [[551, 'Girl', 1980]],
          [[486, 'Girl', 1981]],
          [[567, 'Girl', 1982]],
          [[480, 'Girl', 1983]],
          [[457, 'Girl', 1984]],
          [[551, 'Girl', 1980]],
          [[486, 'Girl', 1981]],
          [[567, 'Girl', 1982]],
          [[480, 'Girl', 1983]],
          [[457, 'Girl', 1984]]],...

Мой код такой:

def create_names_dict(data_list, d):
    for row in data_list:
        if row[1] not in d: #if name not in dict
            d[row[1]] = ([row[2:]]) # make name a key and from freq on the val
        else:
            d[row[1]].append([row[2:]])
    return d #returned filled dict

Любая помощь с этим будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Когда вы передаете словарь в функцию, любые обновления словаря будут видны вызывающей стороне. Это означает, что вам не нужно возвращать словарь, поскольку вы уже управляете переданным словарем.

Проверьте метод .setdefault () для словаря: https://docs.python.org/3/library/stdtypes.html#dict .setdefault

Если ключ существует, он вернет значение. Если ключ не существует, он вставит ключ со значением по умолчанию и вернет вновь установленное значение. Ваша функция может быть упрощена до:

def create_names_dict(data_list, d):
    for row in data_list:
        d.setdefault(row[1], []).append(row[2:])

Затем:

d = {}
create_names_dict(l, d)
print(d)  # d is now populated with name -> [[freq, gender, year],...]

Я подозреваю, что вы получаете дубликаты, потому что, возможно, вы звонили create_names_dict() более одного раза и передавали словарь, так что к нему благополучно добавляются данные по известным ключам. Или во входных данных могут быть дубликаты, в этом случае вам может потребоваться выполнить дополнительные проверки перед добавлением.

0 голосов
/ 25 марта 2020

вы можете использовать:

def create_names_dict(data_list, d):
    for row in data_list:
        if row[1] not in r:
            d[row[1]] = {row[4] : row[2: 4]}
        elif row[4] not in d[row[1]]:
            d[row[1]][row[4]] = row[2: 4]
    return {k: [y + [i] for i, y in v.items()] for k, v in d.items()}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...