在其他词典的帮助下翻译计数器词典的键

时间:2018-07-19 12:53:12

标签: python python-3.x dictionary counter

我是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())

但是,当我运行它时,它将在我的cnt_domains字典(例如'TTTBT')中找到一个不在DictionaryReplaceValues字典中的键时创建一个KeyError:'TTTBT'

3 个答案:

答案 0 :(得分:2)

您可以使用dict.get方法。如果字典中不存在该键,则可以定义默认值。因此,您的代码应如下所示:

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

答案 1 :(得分:0)

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

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

让我们知道您是否希望您的结果实际上是字典或元组列表。

答案 2 :(得分:0)

您似乎想遍历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获取值。如果找不到密钥,则您想不做任何事情来处理该案件。默认情况下,如果您尝试使用没有键的字典来索引字典,则会抛出错误。 .get()方法通过指定要返回的值(默认为None)来解决此问题,如果您要查找的内容不在词典中,则返回错误。