数据STUDIO

停止这样使用 Python 字典!

Image

Image

如果你是个初学者,或者写代码有一段时间了,需要好好看一下你是否也会一样,像接下来的文章一样,错误使用 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)

现在,我们的代码更加清晰、更快。

如果你在写代码过程中也遇到这样的问题,或者其他比较有意思的问题,欢迎讨论。

🏴‍☠️宝藏级🏴‍☠️ 原创公众号『数据STUDIO』内容超级硬核。公众号以Python为核心语言,垂直于数据科学领域,包括可戳👉Python|MySQL|数据分析|数据可视化|机器学习与数据挖掘|爬虫等,从入门到进阶!

长按👇关注- 数据STUDIO -设为星标,干货速递ImageImage