停止这样使用 Python 字典!
如果你是个初学者,或者写代码有一段时间了,需要好好看一下你是否也会一样,像接下来的文章一样,错误使用 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**2my_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)
现在,我们的代码更加清晰、更快。
如果你在写代码过程中也遇到这样的问题,或者其他比较有意思的问题,欢迎讨论。
🏴☠️宝藏级🏴☠️ 原创公众号『数据STUDIO』内容超级硬核。公众号以Python为核心语言,垂直于数据科学领域,包括可戳👉Python|MySQL|数据分析|数据可视化|机器学习与数据挖掘|爬虫等,从入门到进阶!
长按👇关注- 数据STUDIO -设为星标,干货速递