Я новичок в Python и не смог найти ответ на него в Интернете.
Проблема:
У меня якобы простая проблема с переводом ключей в одном словаре с помощью другого словаря.
Это то, что я пытаюсь сделать
У меня есть счетчик-словарь cnt_domains, который включает несколько записей, которые выглядят следующим образом:
[('p_1002095', 5405), ('p_1002780', 4719), ('p_1002590', 3410), ('p_1200050', 2615), ('', 2514), ('p_1002770', 2256), ('p_1001910', 1726), ('p_1002330', 1178), ('p_1002120', 960), ('p_100
2350', 896), ('p_1002980', 677), ('p_1002810', 592), ('p_1001460', 413), ('p_1002680', 335), ('p_1002630', 188), ('p_1002090', 144), ('p_1002490', 70), ('pc_1175', 43), ('TTTBT"', 26)]
Затем у меня есть другой словарь, содержащий значения открытого текста для ключей в приведенном выше словаре, который называется «DictionaryReplaceValues», который выглядит следующим образом:
{'p_1002560': 'Utskr-Tätortskarta_Text', 'p_1002600': 'Stadskarta Utskrift', 'p_1002640': 'ESBO', 'p_1002660': 'Kartkombination Baskarta Husnummer', 'p_1002690': 'Ortofoto länet', '
p_442': 'Kulturhistorisk klassificering', 'p_1002730': 'Husnummer', 'p_1002760': 'Tekniska nämndhuset', 'p_1002380': 'Utskr-Kultur_Historisk', 'p_446': 'SB Byggnader och fastigheter', 'p_
1200015': '1930', 'p_1200016': '1934', 'p_1200017': '1940', 'p_1200018': '1956', 'p_1200019': '1976', 'p_1200020': '1855', 'p_1200053': 'K Byggnadsgeologisk karta ca 1980', 'p_1200063': '
K Underlagskarta för grundvattenskydd 1997', 'p_447': 'SB Stockholmskarta o BF', 'p_1200050': 'Park', 'p_1002980': 'Ortofoto 2017', 'p_1002790': 'Stockholmskarta_hybrid_raster', 'p_100281
0': 'Stockholmskarta_gra_forenklad_nt_raster', 'p_1002870': 'Utskr-Markdetaljer_Markhojder_1000', 'p_1001455': 'Fysisk modell', 'p_470': 'FB Byggnader och fastigheter', 'p_471': 'SH Byggn
ader och fastigheter', 'p_448': 'SHAB Karta', 'p_473': 'IDR Idrottsanläggningar', 'p_1002442': 'Kartkombination Planmodul', 'p_422': 'Kartblad', 'p_1200173': 'Kartblad Sweref99 18 00 1000
m-rutor', 'p_1005020': 'Stadens manér', 'p_1003030': 'Kartkombination Fysisk modell', 'p_478': 'SB Parkering nivå ', 'p_490': 'FSK Byggnader och fastigheter', 'p_1200300': 'FB Ackvisition
skarta', 'p_1200301': 'SB Ackvisitionskarta', 'p_1200302': 'SH Ackvisitionskarta', 'p_1002272': 'DigitalOP data', 'p_1004000': 'Kartkombination SHAB', 'p_1200520': 'Stadens manér utokad',
'p_1001951': 'MF Naturvårdsprio', 'p_1005010': 'Kartkombination Stadens manér Total', 'p_1200303': 'Områdesskötsel', 'p_1002570': 'Stockholmskarta_Grå_Public_TS', 'p_1002590': 'Stockholm
skarta_Grå_nedtonad', 'p_1002620': 'Baskarta med fastigheter - utskrift', 'p_419': 'Fastighetskartan WMS', 'p_443': 'TK Upphandlingsområden', 'p_1002710': 'Bygglovkartan', 'p_1200000': '1
625', 'p_1200001': '1642', 'p_1200002': '1702', 'p_1200003': '1733', 'p_1200004': '1751', 'p_1200005': '1805', 'p_1200006': '1828', 'p_1200007': '1863', 'p_1200009': '1899', 'p_1200010':
'1640', 'p_1200012': '1909', 'p_1200013': '1913', 'p_1200023': 'UTGÅR: xxxxxOrtofoto_natbutiken', 'p_1200033': 'K Grundvattenkartan 1996', 'p_1200043': 'K Geotekniska undersökningar', 'p_
1200073': 'K Räddningsverkets stabilitetsutredning 1998', 'p_1200051': 'Kartkombination Park', 'p_1002625': 'Baskarta med fastigheter för VA', 'p_1002780': 'Stockholmskarta_Gra_forenklad_
nedtonad', 'p_1002930': 'Regionskarta_Ajourföring', 'p_1002940': 'Signalering Tk_till_RN', 'p_1200163': 'UTGÅR:DELETEV7-BK-HJD_RH2000', 'p_1002800': 'Stockholmskarta_gra_forenklad_raster'
, 'p_1002820': 'Ortofoto 2015', 'p_1002830': 'Ortofoto 2006', 'p_1002840': 'Ortofoto 2005', 'p_1002850': 'Stadskarta_raster', 'p_1200153': 'Kartkombination Stockholms fastigheter'}
Я пытаюсь заменить ключи в словаре счетчиков значением соответствующего ключа в словаре открытого текста. Например, заменив «p_1002095» на «Stockholmskarta_hybrid_intern» в качестве ключа, оставив счетчик значений без изменений.
Результат должен выглядеть так:
[('Stockholmskarta_hybrid_intern', 5405), ('Stockholmskarta_Gra_forenklad_nedtonad', 4719), ('Stockholmskarta_Grå_nedtonad', 3410),.... , ('TTTBT', 26)]
Пожалуйста, обрати внимание, что есть несколько ключей (например, «TTTBT»), которые есть только в моем счетчике словаря «cnt_domains», но не в моем словаре «DictionaryReplaceValues». Я хотел бы включить их в мой новый переведенный список «cnt_domains_newname», но их, конечно, не следует переводить на что-то другое.
Вот мой код для этого:
cnt_domains_newname = dict((DictionaryReplaceValues[key], value) for (key, value) in cnt_domains.items())
Но когда я запускаю его, он создает KeyError: 'TTTBT', когда я достигаю ключа в моем словаре cnt_domains (например, 'TTTBT'), которого нет в словаре DictionaryReplaceValues.






Вы можете использовать метод dict.get. Это дает вам возможность определить значение по умолчанию, если ключ отсутствует в словаре. Поэтому ваш код должен выглядеть так:
cnt_domains_newname = dict((DictionaryReplaceValues.get(key, key), value) for (key, value) in cnt_domains.items())
Это похоже на d[key], за исключением того, что вместо повышения KeyError он может возвращать значение по умолчанию. Таким образом, {}.get(key, 0) всегда будет 0, а d.get(key, key) вернет key, если в key нет значения для d.
Это было элегантное решение, и оно почти работает с другим моим кодом. Вы знаете, есть ли возможность создать новый словарь счетчиков вместо обычного словаря?
Объект счетчика может быть создан путем передачи словаря конструктору, то есть в вашем примере: new_counter = Counter (cnt_domains_newname)
если cnt_domains на самом деле является словарем, вы можете использовать понимание словаря и использовать метод словарей get(), чтобы «безопасно» попытаться получить заменяющее значение:
cnt_domains_newname = {DictionaryReplaceValues.get(key, key):value for key, value in cnt_domains.items()}
Сообщите нам, хотите ли вы, чтобы результатом действительно был словарь или список кортежей.
Похоже, вы хотите перебрать каждый кортеж в cnt_domains (который является списком, а не словарем, как вы сказали) и создать новый словарь с правильным именем и соответствующим значением.
new_dict = dict()
for user, val in cnt_domains:
username = DictionaryReplaceValues.get(user) # returns None if user is not found
if username:
# runs only if username is not None (i.e. it was found)
new_dict(username) = val
Вы получаете сообщение об отсутствии TTTBT, потому что вам нужно «безопасно» попытаться получить значения из DictionaryReplaceValues. Если ключ не найден, вы хотите обработать этот случай, ничего не делая. По умолчанию, если вы попытаетесь проиндексировать dict с ключом, которого у него нет, будет выдана ошибка. Метод .get() решает эту проблему, присваивая значение (по умолчанию None), которое будет возвращено вместо ошибки, если то, что вы пытаетесь найти, отсутствует в словаре.
Хм ... я пытаюсь понять функцию get.