Создать список словарей

OmgZomg

Новичок
Пользователь
Апр 22, 2020
30
2
8
Добрый день!
Имеется набор чисел такого вида:
1518 1707
1518 1525
1518 1511
1518 1246
1707 1518
1707 1700
1707 1980
1525 1518
1525 1700
1525 1532
1525 1239
1658 1651
1658 2029
1658 1665
1658 1566
1651 1658
2029 1658
2029 2119
2029 2036
2029 2022

и.т.д.

Как видите, слева числа повторяются.
Нужно из этого создать список словарей такого вида:
Python:
[
    {1518:[1707,1525,1511,1246]},
    {1707:[1518,1700,1980]},
    {1525:[1518,1700,1532,1239]},
    
    .........

]

и т.д.
Как это сделать? Спасибо!
 

Vlad_SD

Активный пользователь
Пользователь
Апр 7, 2020
91
45
18
Добрый день, можно попробовать решить таким способом
Python:
_dict = {}

with open('data.txt', mode="r") as file:
    reader = file.read().splitlines()  # вернёт список строк, удалив перенос строки ('1518 1707', '1518 1525' итд)

    for i in reader:
        _dict.setdefault(int(i.split(' ')[0]), []).append(int(i.split(' ')[1]))

_list = [{key: value} for key, value in _dict.items()]  # создаём список словарей, проходя по каждой паре ключ-значение
 
  • Мне нравится
Реакции: OmgZomg

OmgZomg

Новичок
Пользователь
Апр 22, 2020
30
2
8
Добрый день, можно попробовать решить таким способом
Python:
_dict = {}

with open('data.txt', mode="r") as file:
    reader = file.read().splitlines()  # вернёт список строк, удалив перенос строки ('1518 1707', '1518 1525' итд)

    for i in reader:
        _dict.setdefault(int(i.split(' ')[0]), []).append(int(i.split(' ')[1]))

_list = [{key: value} for key, value in _dict.items()]  # создаём список словарей, проходя по каждой паре ключ-значение

Всё заработало. Спасибо!
 

MacSeem

Пользователь
Пользователь
Май 15, 2020
37
6
8
А можете подсказать, вот это выражение во второй сроке, что это, где прочитать можно как это работает? Пробую расковырять, не получается.

Python:
    for i in reader:
        _dict.setdefault(int(i.split(' ')[0]), []).append(int(i.split(' ')[1]))
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
А можете подсказать, вот это выражение во второй сроке, что это, где прочитать можно как это работает? Пробую расковырять, не получается.

Python:
    for i in reader:
        _dict.setdefault(int(i.split(' ')[0]), []).append(int(i.split(' ')[1]))
Тут используется метод setdefault для установки значения словаря по умолчанию. Логика такая: если ключа нет - то добавляем ключ (первое число из строки), а значение - это список, содержащий второе число из строки. Если ключ уже есть (то есть первое число в строке повторилось) - то добавляем в список значений этого ключа второе число из строки.
Код можно переписать вот так:
Python:
# проходим в цикле по строкам
for i in reader:
    # если в словаре нет ключа равного первому числу из текущей строки
    if _dict.get(int(i.split(' ')[0])) is None:
        # добавляем в словарь этот ключ и пустой список как значение
        _dict[int(i.split(' ')[0])] = []
        # добавляем в этот список второе число из текущей строки
        _dict[int(i.split(' ')[0])].append(int(i.split(' ')[1]))
    # если ключ уже есть в словаре
    else:
        # добавляем в список, который является его значением второе число из текущей строки
        _dict[int(i.split(' ')[0])].append(int(i.split(' ')[1]))
 
  • Мне нравится
Реакции: MacSeem

MacSeem

Пользователь
Пользователь
Май 15, 2020
37
6
8
Тут используется метод setdefault для установки значения словаря по умолчанию. Логика такая: если ключа нет - то добавляем ключ (первое число из строки), а значение - это список, содержащий второе число из строки. Если ключ уже есть (то есть первое число в строке повторилось) - то добавляем в список значений этого ключа второе число из строки.
Код можно переписать вот так:
Python:
# проходим в цикле по строкам
for i in reader:
    # если в словаре нет ключа равного первому числу из текущей строки
    if _dict.get(int(i.split(' ')[0])) is None:
        # добавляем в словарь этот ключ и пустой список как значение
        _dict[int(i.split(' ')[0])] = []
        # добавляем в этот список второе число из текущей строки
        _dict[int(i.split(' ')[0])].append(int(i.split(' ')[1]))
    # если ключ уже есть в словаре
    else:
        # добавляем в список, который является его значением второе число из текущей строки
        _dict[int(i.split(' ')[0])].append(int(i.split(' ')[1]))
спасибо!
 

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