如果你是个初学者,或者写代码有一段时间了,需要好好看一下你是否也会一样,像接下来的文章一样,错误使用 Python 字典。如果你也是一个资深玩家,可以一起探讨!~
不瞒你说,就连我也……但我从错误中吸取了教训,并改正了。所以今天特地总结了几个常见错误,也来阻止你。
错误#1
检查密钥是否存在的错误方法
有时人们会这样做来检查密钥是否存在:
my_dict = {"name": "Kiran", "age": 24}
if "name" in my_dict:
print(my_dict["name"])
else:
print("No name found")
我知道这可行……但我觉得没必要。我们可以用更好的方法来做这件事。
我们可以使用.get()
:
my_dict = {"name": "Kiran", "age": 24}
print(my_dict.get("name", "No name found"))
现在,我们的代码看起来更简洁了。我们不需要额外的 if-else 检查。
错误 #2
我们曾经错误地循环遍历键和值
许多人习惯用这样的循环:
my_dict = {"a": 1, "b": 2, "c": 3}
for key in my_dict:
print(key, my_dict[key])
我知道……这个方法可行。但我们可以用更好的方法。我们可以用.items()
这个来代替。
for key, value in my_dict.items():
print(key, value)
现在...如果我们进行一些字典查找,这将更具可读性并且更快。
错误#3
有时我们使用的update()
方式是错误的
有些初学者是这样合并词典的:
dict1 = {"a": 1, "b": 2}
dict2 = {"b": 3, "c": 4}
dict1.update(dict2)
print(dict1)
这肯定会起作用......但它会
修改 dict1。
除此之外,我们可以使用字典解包:
dict1 = {"a": 1, "b": 2}
dict2 = {"b": 3, "c": 4}
new_dict = {**dict1, **dict2}
print(new_dict) # {'a': 1, 'b': 3, 'c': 4}
这将创建一个新的词典。它更安全,因为不会对原始词典造成意外修改
错误#4
我们可以defaultdict
在不需要的时候使用它
有时...人们过度使用defaultdict
。
例如:
from collections import defaultdict
my_dict = defaultdict(int)
my_dict["a"] += 1 # 有效,但有必要吗?
我知道……这可行。但是……这真的有必要吗?我们可以使用更好的方法,例如:
my_dict = {}
my_dict["a"] = my_dict.get("a", 0) + 1
这将使我们的代码保持简单并避免任何不必要的导入。
我们应该只在真正需要的时候使用defaultdict
它,比如在对值进行分组时。
错误#5
我们总是忽略字典性能
我知道……字典很快。但是当我们的字典变得太大时,它的性能就会下降。
最好不要这样写:
my_dict = {i: i**2 for i in range(10_000_000)}
我们可以使用生成器表达式来节省内存:
def squared_numbers():
for i in range(10_000_000):
yield i, i**2
my_dict = dict(squared_numbers())
它将降低我们的内存使用量,并在我们真正需要时计算值。
错误#6
我们使用setdefault()
错误的方式
你知道……初学者经常犯这个错误:
data = {}
if "name" not in data:
data["name"] = "kiran"
我知道……这可行。但我们有更好的方法:
data = {}
data.setdefault("name", "kiran")
这很清楚,我们不需要额外的if
检查。但是这段代码有一个问题。
setdefault()
总是会返回该值,即使它存在,正如我们在这段代码中看到的那样:
name = data.setdefault("name", some_expensive_function())
"name"
已经存在,data
但 Python 仍会调用。some_expensive_function()
这会浪费时间。
所以最好的方法是使用.get()
name = data.get("name", "kiran")
如果缺少键,此方法只会调用默认值。非常简单……
错误 #7
有些人不使用Counter
计数
通常……许多初学者会尝试像这样手动计算物品:
words = ["apple", "banana", "apple"]
word_count = {}
for word in words:
word_count[word] = word_count.get(word, 0) + 1
我知道……这行得通。但我想——我们可以做得更好。我们可以使用collections.Counter
from collections import Counter
word_count = Counter(words)
现在,我们的代码更加清晰、更快。
如果你在写代码过程中也遇到这样的问题,或者其他比较有意思的问题,欢迎讨论。