1

Тема: Редагування словників у списку

Допоможіть початківцю.
Є словники які знаходяться у списку, ключі у словниках написані з порушенням регістру. Чи є можливість змінити регістр ключів у списку. Якщо що, вибачаюсь, тіки розпочав навчання.
Пробував так:

user_1 = {'Gena': 'python', 'age': '33'}
user_2 = {'niNa': 'ruby', 'age': '31'}
user_3 = {'aNdrey': 'C++', 'age': '23'}
user_4 = {'vIka': 'C++', 'age': '18'}

users = [user_1, user_2, user_3, user_4]
users_correct = {}

for user in users:
    for key, value in user.items():
        key = key.lower()
        value = value.upper()
        users_correct[key] = value
        print(users_correct)
print(users)

Отримую

{'gena': 'PYTHON'}
{'gena': 'PYTHON', 'age': '33'}
{'gena': 'PYTHON', 'age': '33', 'nina': 'RUBY'}
{'gena': 'PYTHON', 'age': '31', 'nina': 'RUBY'}
{'gena': 'PYTHON', 'age': '31', 'nina': 'RUBY', 'andrey': 'C++'}
{'gena': 'PYTHON', 'age': '23', 'nina': 'RUBY', 'andrey': 'C++'}
{'gena': 'PYTHON', 'age': '23', 'nina': 'RUBY', 'andrey': 'C++', 'vika': 'C++'}
{'gena': 'PYTHON', 'age': '18', 'nina': 'RUBY', 'andrey': 'C++', 'vika': 'C++'}
[{'Gena': 'python', 'age': '33'}, {'niNa': 'ruby', 'age': '31'}, {'aNdrey': 'C++', 'age': '23'}, {'vIka': 'C++', 'age': '18'}]

2

Re: Редагування словників у списку

my_dict = {"apple": 1, "banana": 2, "orange": 3}

# змінити ключ з "banana" на "kiwi"
my_dict["kiwi"] = my_dict.pop("banana")

print(my_dict)
# виведе: {"apple": 1, "orange": 3, "kiwi": 2}
Подякували: leofun011

3

Re: Редагування словників у списку

Дякую, але це не те.

4

Re: Редагування словників у списку

Коректний спосіб привести до одного регістру - метод casefold (по факту працює майже як lower, але враховує юнікод)

def keys_casefold(d):
  return {key.casefold():value for key, value in d.items()}

users = [keys_casefold(u) for u in users]
Подякували: Firefox is dead, genada89, leofun013

5

Re: Редагування словників у списку

Оце так, далеко мені ще до цього))))
Дякую за підказку.
Я так розумію вирішувати такі питання через for, це не доцільно.

6

Re: Редагування словників у списку

genada89 написав:

Дякую, але це не те.

чому ж не те?



my_dict = {"aPple": 1, "BanAna": 2, "oRanGe": 3}

for key in list(my_dict.keys()):
        my_dict[key.lower()] = my_dict.pop(key)

print(my_dict)
# виведе: {"apple": 1, "banana": 2, "orange": 3}

регістри міняє ._.

7

Re: Редагування словників у списку

genada89 написав:

Оце так, далеко мені ще до цього))))
Дякую за підказку.
Я так розумію вирішувати такі питання через for, це не доцільно.

Чому? У мене там саме for. Звісно, можна і через map зробити, але тут усе надто просто. Якщо вам спискові вирази заскладні, то будь ласка

def keys_casefold(d):
  new_dict = {}
  for key, value in d.items():
    new_dict[key.casefold()]=value 
  return new_dict

new_users = []
for u in users:
    new_users.append(keys_casefold(u))
users = new_users

Це той самий код, тільки з проміжними змінними.

Подякували: Firefox is dead, genada892

8

Re: Редагування словників у списку

Я просто до функцій def не дойшов, але буду розбиратьсь. Дякую ще раз за відповіді

9

Re: Редагування словників у списку

Вимучав як зробити завдання користуючись лише for без використання def та casefold().

user_1 = {'Gena': 'python', 'age': '33'}
user_2 = {'niNa': 'ruby', 'age': '31'}
user_3 = {'aNdrey': 'C++', 'age': '23'}
user_4 = {'vIka': 'C++', 'age': '18'}

users = [user_1, user_2, user_3, user_4]
new_users = []

for user in users:
    user_cor = {}
    for key, value in user.items():
        user_cor[key.lower()] = value
    new_users.append(user_cor)
print(new_users)

Але ваш код дуже допоміг розібратись з цим питанням. Дякую. Всім мирного неба.

10

Re: Редагування словників у списку

genada89 написав:
user_1 = {'Gena': 'python', 'age': '33'}
user_2 = {'niNa': 'ruby', 'age': '31'}
user_3 = {'aNdrey': 'C++', 'age': '23'}
user_4 = {'vIka': 'C++', 'age': '18'}

users = [user_1, user_2, user_3, user_4]

Тут щось не добре. Треба всі обєкти привести до одного типу вигляду:

users = [
    { 'name': 'Gena',   'lang': 'Python', 'age': 33 },
    { 'name': 'niNa',   'lang': 'Ruby',   'age': 31 },
    { 'name': 'aNdrey', 'lang': 'C++',    'age': 23 },
    { 'name': 'vIka',   'lang': 'C++',    'age': 18 },
]

і числа мають залишатись числами.

Подякували: Tarpan871

11

Re: Редагування словників у списку

Мені підказали, що мій варівнт зі словниками теж не ок. Так можна було робити раніше, для застарілих версій Python.
Тепер, для Python 3.7+, в подібних випадках треба брати @dataclass :

from dataclasses import dataclass, field
from typing import List

@dataclass
class User:
    """Class description: User info"""
    name: str = None
    lang: List[str] = field(default_factory=List[str])
    age: float = 0.0

users: List[User] = [
    User(name='Gena',   lang=['Python'], age=33),
    User(name='Nina',   lang=['Ruby'],   age=31),
    User(name='Andriy', lang=['C++'],    age=23),
    User(name='Vika',   lang=['C++'],    age=18),
]
for user in users:
    print(user)
Подякували: ReAl, genada892

12

Re: Редагування словників у списку

Це було просто завдання, я його виконав. АЛЕ, я бачу, що багато чого треба ще вивчити. ДУЖЕ дякую, що демонструєте версії простійшої програми,  досконалішими способами. Буду вивчати.

13

Re: Редагування словників у списку

Також можна додатково поставити бібліотеку attrs і користувати @define.

mCoding - attrs vs dataclasses (видиво англ.)