Уведомления

Группа в Telegram: @pythonsu

#1 Март 14, 2019 00:30:41

Tsunetomo
Зарегистрирован: 2015-04-01
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Список как ключ словаря

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

  ['Львовская обл.', "КАМЯНКА-БУЗКИЙ РАЙОН", 'САПИЖАНКА']: '111111'
,
в переменную regions я подготовил список списков для ключей, в переменную city_code я загнал значения словарей. попытался создать нужный мне формат словаря вот таким вот способом: check_code = dict((str(i), i) for i in list(zip(regions, city_code))), но к сожалению на выходе получил вот это:
 '[\'Львовская обл.\', "КАМЯНКА-БУЗКИЙ РАЙОН", \'САПИЖАНКА\']': '111111'
Подскажите пожалуйста как привести ключи словаря к нужному формату ()? Вот код:
 # -*- coding: utf-8 -*-
import xlrd
import xlwt
from xlutils.copy import copy
rb = xlrd.open_workbook('справочник населенных пунктов.xls')   # открываем файл с кодами населенных пунктов
sheet = rb.sheet_by_index(0)  # считывем первый лист книги
value1 = sheet.col_values(0)[1:]  # считываем значение ячеек 1 столбца начиная с 2
value2 = sheet.col_values(1)[1:]  # считываем значение ячеек 2 столбца начиная с 2
value3 = sheet.col_values(2)[1:]  # считываем значение ячеек 3 столбца начиная с 2
value4 = sheet.col_values(3)[1:]  # считываем значение ячеек 4 столбца начиная с 2
city_code = []
for i in value4:
    city_code.append(str(int(i)))
value5 = [value1, value2, value3]
regions = list(map(list, zip(*value5)))  # соединяем в один список значение ячеек 1,2,3 столбца
# print(regions)
check_code = dict((str(i[0]), i[1]) for i in list(zip(regions, city_code)))
print(check_code)

Отредактировано Tsunetomo (Март 14, 2019 00:34:22)

Офлайн

#2 Март 14, 2019 05:03:26

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Список как ключ словаря

Tsunetomo
1) Если хотите получить строку из списка, то применяйте либо “”.join() либо json
2) Если списки известной длины, то используйте вместо них кортежи - кортежи хешируемые объекты и могут быть ключами словаря
3) Имхо, работать со строками, как с представлением некоторого объекта это как-то фу. Сделайте нормальные объекты! Будете хранить в своих списках ссылки на объект, а не какую-то непонятную строку.

  
class Place:
    def __init__(self, name):
        self.name = name
  
class Places:
  
    def __init__(self):
        self.places = []
  
    def add(self, place):
        self.places.append(place)
  
places = Places()
  
def read_xls(filename):
    for record in data:
        place = Place(record.value[1])
        places.add(place)

Т.е. сделайте нормальные простые прозрачные структуры хранящие ваши данные, вот эта вся городьба list(map(list, zip( - это ужасно, не надо так делать.



Офлайн

#3 Март 14, 2019 08:45:29

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Список как ключ словаря

Tsunetomo
с задачей создать словарь ключи которого должны быть списками
Если коротко то такая задача неразрешима. Ключами могут быть ТОЛЬКО неизменяемые сущности.

Правильно вам говорят, придумайте нормальную структуру данных(по крайней мере возможную) для вашей программы.



Офлайн

#4 Март 14, 2019 09:41:52

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

Список как ключ словаря

Если уж очень хочется видеть ключ как список, то тогда используйте кортеж. Он точно хешируемый объект и годится на роль ключа.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version