Как выполнить итерацию по списку и словарю во вложенном цикле for

#python #dictionary #for-loop #nested

#питон #словарь #для-петли #вложенный

Вопрос:

Я использую python 3.9 и пытаюсь взять информацию из списка python и словаря python и повторить ее в цикле. Правильный адрес электронной почты будет взят из словаря в зависимости от устройства.

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

Я понимаю, что это довольно глупо, но я, должно быть, где-то совершаю фундаментальные ошибки, и после попыток разобраться в этом в течение последних 5 часов пришло время обратиться за помощью.

 # Dictionary of metals and email addresses metals = {  'gold':'1@gmail.com',  'silver':'2@gmail.com',  'platinum':'3@gmail.com', }  # Variable holding some string data gold = """ Gold is a chemical element with the symbol Au and atomic number 79,  """ silver = """ Silver is a chemical element with the symbol Ag and atomic number 47.  """ platinum = """ Platinum is a chemical element with the symbol Pt and atomic number 78. """  units = [gold, silver, platinum]  # What I want to do is have a loop where it takes the item in the list #, for example, gold, matches it with the key to that in the dictionary, thereby # enabling me to send gold to 1@gmail.com, silver to 2@gmail.com, and platinum to # 3gmail.com  for unit in units:  for metal in metals.items():  if unit == gold:  email_address = metals.get('gold')  print(email_address)  elif unit == silver:  email_address = metals.get('silver')  print(email_address)  elif unit == platinum:  email_address = metals.get('platinum')  print(email_address)  else:  print('No Match')  # just some code to print out various bits of information # Print our Dictionary Keys for k in metals.keys():  print('Keys: '   k)  # Print our dictionary Values for v in metals.values():  print('Values: '   v)  # print out the values held in our list for item in units:  print('Items: '   item)  

и вот результат:

 1@gmail.com 1@gmail.com 1@gmail.com 2@gmail.com 2@gmail.com 2@gmail.com 3@gmail.com 3@gmail.com 3@gmail.com Keys: gold Keys: silver Keys: platinum Values: 1@gmail.com Values: 2@gmail.com Values: 3@gmail.com Items:  Gold is a chemical element with the symbol Au and atomic number 79,   Items:  Silver is a chemical element with the symbol Ag and atomic number 47.   Items:  Platinum is a chemical element with the symbol Pt and atomic number 78.  

Комментарии:

1. В чем смысл внутреннего for цикла? Разве вы не можете просто удалить его, так как он делает то, чего вы на самом деле не хотите делать?

2. Спасибо @samwise. Иногда я просто переоцениваю вещи. Я полагаю, что в этом и заключается проблема с тем, чтобы быть новичком в этом. просто слишком все усложняю

Ответ №1:

Просто удалите внутреннюю for петлю, изменив это:

 for unit in units:  for metal in metals.items():  if unit == gold:  email_address = metals.get('gold')  print(email_address)  elif unit == silver:  email_address = metals.get('silver')  print(email_address)  elif unit == platinum:  email_address = metals.get('platinum')  print(email_address)  else:  print('No Match')  

к этому:

 for unit in units:  if unit == gold:  email_address = metals.get('gold')  print(email_address)  elif unit == silver:  email_address = metals.get('silver')  print(email_address)  elif unit == platinum:  email_address = metals.get('platinum')  print(email_address)  else:  print('No Match')  

Там нет правила, которое говорит, что вам нужно повторять metals , чтобы позвонить metals.get .

Ответ №2:

В нем есть 3 предмета metals.items() . Вот почему цикл выполняется 3 раза. Просто удалите это утверждение; вам не нужен этот цикл

 for unit in units:  if unit == gold:  ...