当并非所有值都存在时,使用dict作为键

时间:2018-01-07 23:27:48

标签: python dictionary

我的情况是某些城市名​​称需要重命名,所以我使用的是一个字典,其中键是旧的城市名称,值是新的。但是,只有一些城市需要重新命名,因此并非所有可能的城市都在该字典中。

我知道如何做的唯一方法是除了一个KeyError,当城市不需要重命名时,这有效,但我不确定这是不好的做法,还是有任何垮台这个。有什么我想念的吗?

# Set Venue
venue_name = unidecode(cell[2].get_text())
try:
    # Correct venue names i.e. Cairns, QLD = Cairns
    venue_name = VENUE_NAMES_DICT[venue_name]
except KeyError:
    pass

5 个答案:

答案 0 :(得分:2)

正如@jarmod建议的那样,您可以使用标准词典的.get()方法在缺少密钥时提供默认值。没有描述的是,通过将venue_name值作为默认值传递给.get(),此方法可以让您将问题转化为单行。

# Set Venue
venue_name = unidecode(cell[2].get_text())
# Correct venue names i.e. Cairns, QLD = Cairns
venue_name = VENUE_NAMES_DICT.get(venue_name, venue_name)

如果venue_name作为字典中的键存在,.get()将返回所需的新值。如果不存在,.get()将返回venue_name的原始值不变。这消除了对任何条件逻辑的需要。

答案 1 :(得分:0)

你可以做的是使用defaultdict

        scope.vars.forEach(function(elem,i){
            scope.$watch('vars['+i+']', function(newValue, oldValue) {

                // need to access i when the object is changed

            });
        });

示例:

from collections import defaultdict
d=defaultdict(list) #this will return a empty list everytime a new key is used or if key exists it will appendt the value to the list
d[venue_name]=a

答案 2 :(得分:0)

您可以在"中使用",如下所示:

data = ['Chicago', 'NYC', 'Boston', 'SD']

dictionary = {'NYC': 'New York', 'SD': 'San Diego'}

new_list = []

for x in data:
    if x in dictionary:
        new_list.append(dictionary[x])
    else:
        new_list.append(x)

print(new_list)

#output

['Chicago', 'New York', 'Boston', 'San Diego']

使用列表理解

data = ['Chicago', 'NYC', 'Boston', 'SD']
dictionary = {'NYC': 'New York', 'SD': 'San Diego'}
new_list=[dictionary[x] if x in dictionary else x for x in data]
print(new_list)


['Chicago', 'New York', 'Boston', 'San Diego']

答案 3 :(得分:0)

您可以使用dict.get(key,default_value)并提供默认值。

答案 4 :(得分:-1)

一般而言,针对非例外情况抛出异常是设计不佳。你想要一个media/image/my-fancy-image.png

defaultdict

现在,from collections import defaultdict renames = defaultdict(lambda: None) # Add the elements to renames here ... 是一个字典,但如果该密钥不存在,则返回renames而不是抛出,因此您只需检查值None是否可以看到如果需要重命名。