Функция для построения неизвестного количества словарей - PullRequest
0 голосов
/ 08 мая 2020

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

Я допустил (ладья ie) ошибку. Я жестко запрограммировал предопределенный набор словарей, игнорируя возможные будущие случаи.

Мой фрагмент:

primarytuesday = {}
secondarytuesday = {}
primarythursday = {}
secondarythursday = {}
coaches = [["4/27/1976", "Person One", "Site 1"], ["4/27/1976", "Person Two", "Site 1"],
       ["4/29/1976", "Person Three", "Site 1"], ["4/29/1976", "Person Four", "Site 1"]]


def sort_coaches(date, primary, secondary):
    for eachsession in coaches:
        if eachsession[0] == date:
            if eachsession[2] in primary:
                secondary[eachsession[2]] = eachsession[1]
            else:
                primary[eachsession[2]] = eachsession[1]


sort_coaches("4/27/1976", primarytuesday, secondarytuesday)
sort_coaches("4/29/1976", primarythursday, secondarythursday)

Вывод (работает по назначению) :

  1. primarytuesday == {'Site 1': 'Person One'}
  2. secondarytuesday == {'Site 1': 'Person Two'}
  3. primarythursday == {'Site 1': 'Person Three'}
  4. secondarythursday == {'Site 1': 'Person Four'}

Проблема: Проблема возникает, если третье значение для определенного дня добавляется в список, как в ...

coaches = [["4/27/1976", "Person One", "Site 1"], ["4/27/1976", "Person Two", "Site 1"], ["4/27/1976", "Person Three", "Site 1"]
           ["4/29/1976", "Person Four", "Site 1"], ["4/29/1976", "Person Five", "Site 1"]]

Выходные данные изменяют значение во вторник на третье лицо и получают полностью избавиться от второго человека. Имеет смысл, но не то, что предназначено.

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

В стороне: я уверен, что есть более эффективные способы, чем перебирать весь список и сравнивать eachsession[0] с date в пределах l oop, но пусть это будет примером того, где я нахожусь как кодировщик.

1 Ответ

2 голосов
/ 08 мая 2020

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

Фактически, вы можете преобразовать все это в главный словарь, проиндексированный на дат за один проход, а затем использовать словарь:

coaches = [["4/27/1976", "Person One", "Site 1"], ["4/27/1976", "Person Two", "Site 1"], ["4/27/1976", "Person Three", "Site 1"],
           ["4/29/1976", "Person Four", "Site 1"], ["4/29/1976", "Person Five", "Site 1"]]

sortedCoaches = dict()
for date,person,site in coaches:
    day = sortedCoaches.setdefault(date,list())
    d   = next((d for d in day if site not in d),dict())
    if not d: day.append(d)                    
    d[site] = person


dayInfo = sortedCoaches["4/27/1976"]
[{'Site 1': 'Person One'}, {'Site 1': 'Person Two'}, {'Site 1': 'Person Three'}]


dayInfo = sortedCoaches["4/29/1976"]
[{'Site 1': 'Person Four'}, {'Site 1': 'Person Five'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...