Python, использующий цикл for для обновления вложенных значений словаря с пониманием - PullRequest
0 голосов
/ 29 августа 2018

Я борюсь с этим для цикла. Я хочу обновить значение вложенного словаря со списком. следующие работы, но я хотел бы использовать для цикла для сжатия кода. "status" - это вложенный словарь с внешним ключом "A" и "B", а binary_list[] только со всеми 1.

Trucks = ["A", "B"]
Days= ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday",    
"Saturday", "Sunday"]

requests={"A": {"Monday":0, "Tuesday":0, "Wednesday":0, "Thursday":0     
                "Friday":0, "Saturday":0, "Sunday":0},
          "B": {"Monday":0, "Tuesday":0, "Wednesday":0, "Thursday":0,    
                "Friday":0, "Saturday":0, "Sunday":0}}


binary_list=[1,1,1,1,1,1,1,1,1,1,1,1,1,1]



status["A"]["Monday"]=binary_list[0]
status["A"]["Tuesday"]=binary_list[1]
status["A"]["Wednesday"]=binary_list[2]
status["A"]["Thursday"]=binary_list[3]
status["A"]["Friday"]=binary_list[4]
status["A"]["Saturday"]=binary_list[5]
status["A"]["Sunday"]=binary_list[6]

status["B"]["Monday"]=binary_list[7]
status["B"]["Tuesday"]=binary_list[8]
status["B"]["Wednesday"]=binary_list[9]
status["B"]["Thursday"]=binary_list[10]
status["B"]["Friday"]=binary_list[11]
status["B"]["Saturday"]=binary_list[12]
status["B"]["Sunday"]=binary_list[13]

что я пробовал:

   for truck in Trucks:
        for day in Days:
            requests[truck][day]=[j for j in binary_list]

это даст 14 1 в списке как значение каждого дня. Я понимаю, почему это происходит. это из-за двух циклов for, поэтому я решил, что мне нужны вложенные словарные выражения, чтобы все было в одну строку. Я не уверен, что это правильно, но с моим ограниченным знанием это кажется правильным направлением. мои вопросы, как мне это сделать? Кто-нибудь, пожалуйста, помогите. Еще раз спасибо за ваше время.

Ответы [ 4 ]

0 голосов
/ 29 августа 2018

Вы можете использовать словарное понимание, чтобы сделать это одним и более "питоническим" способом следующим образом:

it = iter(binary_list)
status = {x: {d: next(it) for d in Days} for x in Trucks}
# outputs: {'A': {'Monday': 1, 'Tuesday': 1, 'Wednesday': 1, 'Thursday': 1, 'Friday': 1, 'Saturday': 1, 'Sunday': 1}, 'B': {'Monday': 1, 'Tuesday': 1, 'Wednesday': 1, 'Thursday': 1, 'Friday': 1, 'Saturday': 1, 'Sunday': 1}}
0 голосов
/ 29 августа 2018

что вы делаете неправильно, j для j в двоичном списке] будет создавать список для каждого запроса [грузовик] [день], и это не то, что вы хотите, то, что вы хотите, это что-то вроде этого

binary_list_iterator=0

for truck in Trucks:
    for day in Days:
        requests[truck][day]=binary_list[binary_list_iterator]
        binary_list_iterator+=1
0 голосов
/ 29 августа 2018

Это то, что вы хотите?

requests = {t: {d: 1 for d in Days} for t in Trucks}

Или, если вы хотите все повторить

requests = {t: {d: binary_list[i*len(Days)+j] for j, d in enumerate(Days)} for i, t in enumerate(Trucks)}

0 голосов
/ 29 августа 2018

Вы можете использовать итератор для перебора значений binary_list вместо:

iter_binary_list = iter(binary_list)
for truck in Trucks:
    for day in Days:
        requests[truck][day] = next(iter_binary_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...