Python, использующий цикл for для обновления вложенных значений словаря с пониманием

1

Я борюсь с этим за цикл. Я хочу обновить значение вложенного словаря со списком. следующие работы, но я хотел бы использовать для цикла для уплотнения кода. "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 в списке в качестве значения каждого дня. Я понимаю, почему это происходит. это из-за циклов 2 для циклов, поэтому я решил, что мне нужны вложенные словарные слова, чтобы сделать все в одну строку. Я не уверен, что это правильно, но с моими ограниченными знаниями, которые, кажется, правильное направление. мои вопросы: как мне это сделать? кто-то, пожалуйста, помогите. Еще раз спасибо за ваше время.

Теги:
python-3.x
for-loop
nested
dictionary-comprehension

4 ответа

1
Лучший ответ

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

iter_binary_list = iter(binary_list)
for truck in Trucks:
    for day in Days:
        requests[truck][day] = next(iter_binary_list)
  • 1
    спасибо, черт побери, imtinan Azhar, sinwoobang moe A. Я смог прочитать больше об этом, чтобы узнать больше о вашем решении. Я действительно ценю.
1

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

binary_list_iterator=0

for truck in Trucks:
    for day in Days:
        requests[truck][day]=binary_list[binary_list_iterator]
        binary_list_iterator+=1
1

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

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}}
1

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

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)}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню