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

Astone

Новичок
Пользователь
Окт 26, 2020
2
0
1
Не могу понять как сделать функции для словаря в словаре, каким образом передавать аргументы, если там есть string. Было бы хорошо, если кто нибудь смог бы написать хотя бы одну функцию, тогда я бы понял ход выполнения задания и думаю смог бы доделать остальное. Заранее спасибо!
Вот код, для которого нужно сделать все эти задания:

my_dict={'1':{'surname':'Musk', 'name':'Elon', 'gender': 'm','growth':183},
'2':{'surname':'Holmes', 'name':'Enola', 'gender': 'f','growth':175},
'3':{'surname':'Brown', 'name':'Lilly', 'gender': 'f','growth':178},
'4':{'surname':'Lothbrok', 'name':'Ragnar', 'gender': 'm','growth':189},
'5':{'surname':'Smith', 'name':'Adreana', 'gender': 'f','growth':173},
'6':{'surname':'Moon', 'name':'Larry', 'gender': 'm','growth':184}}
for key in my_dict:
if my_dict[key]['gender']=='m':
male_max_growth = max(my_dict.keys(), key=(lambda key: my_dict[key]['growth']))
tallest_guy=my_dict[male_max_growth]['surname']
print('The tallest guy: ', tallest_guy)

for key in my_dict:
if my_dict[key]['gender']=='f':
female_min_growth = min(my_dict.keys(), key=(lambda key: my_dict[key]['growth']))
lowest_girl=my_dict[female_min_growth]['surname']
print('The lowest girl: ', lowest_girl)

for key in my_dict:
sorted_key=sorted(my_dict.keys(), key=(lambda key: my_dict[key]['surname']))
for i in sorted_key:
student1=sorted_key[0]
student2=sorted_key[1]
student3=sorted_key[2]
student4=sorted_key[3]
student5=sorted_key[4]
student6=sorted_key[5]
print('Information about sorted students: ')
print(my_dict[student1])
print(my_dict[student2])
print(my_dict[student3])
print(my_dict[student4])
print(my_dict[student5])
print(my_dict[student6])
print('The correct order: ')
print(sorted_key)
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 581
457
83
код вставляйте через теги code, где пишите сообщение чуть выше в панели инструментов есть три точки -> код и туда вставляете свой код соблюдая все отступы, в питоне они важны
функция - это именованный блок кода, который вызывается по этому имени в любом месте программы
вы можете свои циклы for поместить в функцию и вызвать ее
к примеру так
Python:
def func():
    for key in my_dict:
        if my_dict[key]['gender']=='m':
            male_max_growth = max(my_dict.keys(), key=(lambda key: my_dict[key]['growth']))
            tallest_guy=my_dict[male_max_growth]['surname']
    return 'The tallest guy: ', tallest_guy
print(func())
открытие файла пример
Python:
try:
    with open('dict.txt', 'r') as file:
        line = file.read().splitlines()
except PermissionError:
    print('Недостаточно прав')
except FileNotFoundError:
    print('Файл не найден')
дальше через те же for пишите инфу в словарь
 
  • Мне нравится
Реакции: Astone

Astone

Новичок
Пользователь
Окт 26, 2020
2
0
1
Спасибо большое за ответ, я переделал код под функции, но до сих пор никак не могу сделать заполнение информации в словарь из файла, я не до конца понимаю как правильно должны быть записаны данные в файле, и каким образом организовать само заполнение, понимаю, что через for, но сколько пробовал не получается сделать словник словников.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 581
457
83
можно так
Python:
my_dict = {'1': {'surname': '', 'name': '', 'gender': '', 'growth': 0},
           '2': {'surname': '', 'name': '', 'gender': '', 'growth': 0},
           '3': {'surname': '', 'name': '', 'gender': '', 'growth': 0},
           '4': {'surname': '', 'name': '', 'gender': '', 'growth': 0},
           '5': {'surname': '', 'name': '', 'gender': '', 'growth': 0},
           '6': {'surname': '', 'name': '', 'gender': '', 'growth': 0}}
list_file = []

with open('dict.txt', 'r') as file:
    line = file.read().splitlines()
    for i in line:
        list_file += i.split(', ')

count = 0
for key in my_dict:
    for key_2 in my_dict[key]:
        my_dict[key][key_2] = list_file[count]
        count += 1

print(my_dict)

файл dict.txt
Код:
Musk, Elon, m, 183
Holmes, Enola, f, 175
Brown, Lilly, f, 178
Lothbrok, Ragnar, m, 189
Smith, Adreana, f, 173
Moon, Larry, m, 184
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Лучше создавать элементы в словаре динамически (так как в файле может быть много строк).
Вот так например:
Python:
my_dict = {}
lst = ['surname', 'name', 'gender', 'growth']

with open('dict.txt', 'r') as f:
    for i, item in enumerate(f):
        vals = item.split(',')
        vals[-1] = int(vals[-1].strip())
        my_dict[str(i + 1)] = {x: y for x, y in zip(lst, vals)}

print(my_dict)
 
  • Мне нравится
Реакции: regnor

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 581
457
83
Лучше создавать элементы в словаре динамически (так как в файле может быть много строк).
Вот так например:
Python:
my_dict = {}
lst = ['surname', 'name', 'gender', 'growth']

with open('dict.txt', 'r') as f:
    for i, item in enumerate(f):
        vals = item.split(',')
        vals[-1] = int(vals[-1].strip())
        my_dict[str(i + 1)] = {x: y for x, y in zip(lst, vals)}

print(my_dict)
да так лучше
 

Форум IT Специалистов