借助另一本字典翻译反字典键

2024-09-29 01:32:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python新手,在网上还没找到答案

问题:

我有一个很简单的问题,在另一本词典的帮助下翻译一本词典中的关键字

这就是我要做的

我有一个名为“cnt\u 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'}

我试着用明文字典中corresbonding键的值替换counter字典中的键。例如,将“p\u 1002095”替换为“Stockholmskarta\u hybrid\u intern”,使值计数保持不变

所以结果应该是这样的:

   [('Stockholmskarta_hybrid_intern', 5405), ('Stockholmskarta_Gra_forenklad_nedtonad', 4719), ('Stockholmskarta_Grå_nedtonad', 3410),.... , ('TTTBT', 26)]

请注意在我的计数器字典“cnt\u domains”中有许多键(例如“TTTBT”),但在我的“DictionaryReplaceValues”字典中没有。我想把它们包括在我的新翻译列表“cnt\u domains\u newname”中,但它们当然不应该被翻译成其他东西

这是我的代码:

cnt_domains_newname = dict((DictionaryReplaceValues[key], value) for (key, value) in cnt_domains.items())

但当我运行它时,当我在cnt\u domains字典(如“TTTBT”)中找到一个DictionaryReplaceValues字典中不存在的键时,它会创建一个KeyError:“TTTBT”


Tags: 字典sbdomainsrastercntochtttbtfastigheter
3条回答

看起来您希望循环cnt\ U域中的每个元组(这是一个列表,而不是您所说的字典),并创建一个具有正确名称和相应值的新字典

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)来解决这个问题,如果您试图查找的内容不在字典中,则返回该值而不是错误

如果cnt_domains实际上是一个字典,您可以使用字典理解并使用字典的get()方法“安全地”尝试获取替换值:

cnt_domains_newname = {DictionaryReplaceValues.get(key, key):value for key, value in cnt_domains.items()}

让我们知道如果你想你的结果实际上是一个字典或元组列表

您可以使用^{}方法。它使您能够在字典中不存在键的情况下定义默认值。因此,您的代码应该如下所示:

cnt_domains_newname = dict((DictionaryReplaceValues.get(key, key), value) for (key, value) in cnt_domains.items())

相关问题 更多 >