Python: прочитайте файл и превратите его в словарь с первой + второй строкой, являющейся ключом

Я пытаюсь прочитать файл, который выглядит примерно так:

Lee
Louise
12345678
711-2880 Nulla St. Mississippi
Chapman
Eric
27681673
Ap 867-859 Sit Rd. New york
(...)

и превратите его в словарь с фамилией и именем в качестве ключей, а значениями будут фамилия, имя, телефон и адрес. Это должно выглядеть примерно так:

{'Lee Louise': ['Lee','Louise','12345678','711-2880 Nulla St. Mississippi'],'Chapman Eric': ['Chapman','Eric','27681673','Ap #867-859 Sit Rd. New york']}

И вот что я сделал до сих пор:

d = dict()
fr = open('file.txt', 'r').readlines()
info = [k.split('\n') for k in fr]
for k in range(len(info)):
    if k % 4 == 0:
        list = info[k :k + 4]
        new_list = [b[0] for b in list]
        d[info[k][0]] = new_list
return d

Мне удалось только превратить фамилии в ключи. Что я могу сделать, чтобы превратить и фамилию, и имя в ключи?


person bubblyc    schedule 16.04.2017    source источник


Ответы (2)


Есть несколько проблем с вашим кодом

  • Вы переопределяете функцию Python list — плохая идея.
  • Вы уже читаете строки - используйте strip('\n'), split создает паразитный список.
  • Используйте диапазон на шаге 4.
  • Я упоминал однобуквенные имена переменных?

Я бы переписал фрагмент вашего кода как

info = open(...).read().splitlines()  # Saves from re-building list
for offset in range(0, len(info), 4):
    d[' '.join(info[offset: offset + 2]) = info[offset: offset + 4]

Нет паразитного списка — сохранение из беспорядка new_list

person volcano    schedule 16.04.2017

заменить d[info[k][0]] = new_list

с участием:

d[" ".join([info[k][0],info[k][1]]]) = new_list

person MattMcKnight    schedule 16.04.2017
comment
Для соединения требуется один позиционный аргумент — список или кортеж строк. Так не пойдет. И слайс все равно будет элегантнее - person volcano; 16.04.2017
comment
Я сделал это, и он говорит TypeError: join() принимает ровно один аргумент (2 задано), что мне делать? - person bubblyc; 16.04.2017
comment
извините, как сказал вулкан, нужно добавить скобки или скобки вокруг списка элементов, к которым нужно присоединиться, отредактировано, чтобы показать это. он также предложил что-то вроде d[ .join(info[k][0:2])] = new_list - person MattMcKnight; 17.04.2017