这篇文章介绍了Python的一些不错的功能list
,set
以及tuple
数据类型。我最近了解了这些,发现它们很有趣,并想与您,我的程序员伙伴分享。
套
这是最有趣的部分。我们将了解运算符<, <=, >, >=
如何处理集合操作数。==
运算符对集合的作用有些明显,但是当我们冒险对集合进行排序时,会有一些有趣的行为。如果您之前没有考虑过这一点,请在进一步阅读之前尝试猜测比较运算符的工作原理。
<span style="background-color:#f2f2f2"><span style="color:#292929">{'bread'} <= {'bread', 'butter'}
# 真</span><span style="color:#292929">{'bread', 'jam'} <= {'bread', 'butter'}
# 假</span><span style="color:#292929">{'bread'} <= {'bread'}
# 真</span></span>
这是里摹HT!<=
与issubset
on重载set
。<
运算符上定义的行为略有不同:
<span style="background-color:#f2f2f2"><span style="color:#292929">{'bread'} < {'bread', 'butter'}
# 真</span><span style="color:#292929">{'bread'} < {'bread'}
# 假</span></span>
区别在于<
定义左操作数是否是右操作数的严格子集。这意味着左操作数是右操作数的子集,但不等于右操作数。这可能是一个有用的区别,特别是因为 上没有isstrictsubset
或isstrictsuperset
方法set
。
我不会详细介绍>
和的行为>=
,因为您可以或多或少地用超集替换子集,并在上一节中进行乘以 -1 的代数等价。让我们这样做:
<span style="background-color:#f2f2f2"><span style="color:#292929">{'bread', 'butter'} >= {'bread'}
# 真</span><span style="color:#292929">{'bread', 'jam'} >= {'bread', 'butter'}
# 假</span><span style="color:#292929">{'bread'} >= {'bread'}
# 真</span><span style="color:#292929">{'bread', 'butter'} > {'bread'}
# 真</span><span style="color:#292929">{'bread'} > {'bread'}
# 假</span></span>
现在您可以对集合进行链式比较:
<span style="background-color:#f2f2f2"><span style="color:#292929">{'bread'} <= {'bread', 'butter'} <= {'bread', 'butter', 'eggs'}
# 真</span></span>
在这里,我无偿地添加了等效的代码,issubset
用于显示我们已经走了多远:
<span style="background-color:#f2f2f2"><span style="color:#292929">{'bread'}.issubset({'bread', 'butter'}) 和 {'bread', 'butter'}.issubset({'bread', 'butter', 'eggs'})</span></span>
奖金
不起眼的^
运算符,它因对称差异而过载。这是什么意思?它是出现在一个但不是左右操作数中的一组元素:
<span style="background-color:#f2f2f2"><span style="color:#292929">def symmetric_difference(a: set, b: set) -> set:
return {elt for elt in a | b if (elt in a) ^ (elt in b)}</span><span style="color:#292929">symmetry_difference({'bread', 'butter'}, {'bread', 'jam'})
# {'butter', 'jam'}</span><span style="color:#292929">{'bread', 'butter'} ^ {'bread', 'jam'}
# {'butter', 'jam'}</span></span>
注意^
集合理解中的 。从头到尾都是异或!
列表、元组、字符串,天哪!
列表、元组和字符串上的比较运算符的工作方式相同。运算符<, <=, >, >=
定义了字典顺序,这是一种根据对象元素的顺序对对象序列进行排序的方法。这是字母排序的概念,推广到包含定义了<
和>
运算符的任何类型对象的序列。这就是事情变得奇怪的地方!
让我们从字符串开始:
<span style="background-color:#f2f2f2"><span style="color:#292929">'01' == '01'
# 真</span><span style="color:#292929">'01' < '10'
# 真</span><span style="color:#292929">'11' < '2'
# 真</span><span style="color:#292929">'2' > '10' > '1'
# 真</span></span>
请注意,这与列表的工作方式相同:
<span style="background-color:#f2f2f2"><span style="color:#292929">[0, 1] == [0, 1]
# 真</span><span style="color:#292929">[0, 1] < [1, 0]
# 真</span><span style="color:#292929">[1, 1] < [2]
# 真</span><span style="color:#292929">[2] > [1, 0] > [1]
# 真</span></span>
和元组:
<span style="background-color:#f2f2f2"><span style="color:#292929">(0, 1) == (0, 1)
# 真</span><span style="color:#292929">(0, 1) < (1, 0)
# 真</span><span style="color:#292929">(1, 1) < (2,)
# 真</span><span style="color:#292929">(2,) > (1, 0) > (1,)
# 真</span></span>
奖金
您甚至可以比较异构类型的列表:
<span style="background-color:#f2f2f2"><span style="color:#292929">[2, 'a'] < [2, 'b']
# 真</span><span style="color:#292929">[2, [1, 0]] < [2, [2, 1]] # (:
# 真</span></span>
只需确保类型按元素匹配即可:
<span style="background-color:#f2f2f2"><span style="color:#292929">[3, 4] < [3, 'a']
# 类型错误:'int' 和 'str' 实例之间不支持 '<'</span></span>
结论
我希望这次探索能让您思考您的编程语言可以做什么和应该做什么,而不是重用您已经看过的代码片段。下次您想到某事并想知道它是否有效时,请尝试一下!
七爪网7claw.com