python - 列表中的单个元素
问题描述
我对python相当陌生,我发现这段代码是为了在列表中找到一个元素
这是代码:
def single_number(arr):
ones, twos = 0, 0
for x in arr:
ones, twos = (ones ^ x) & ~twos, (ones & x) | (twos & ~x)
assert twos == 0
return ones
arr1 = [5, 3, 4, 3, 5, 5, 3]
print(single_number(arr1))
我似乎无法理解这条线在做什么
ones, twos = (ones ^ x) & ~twos, (ones & x) | (twos & ~x)
assert twos==0
解决方案
该行的目的是实现一个操作,如果对输入应用三次,则返回原始值,如果应用一次,则保留输入。
如果我们想从包含对而不是三元组的数组中选择单个值,则更容易理解。那我们就可以做...
ones = ones ^ x
...因为 y ^ x ^ x == y。所以所有的对都抵消了,你只剩下一个值。
正如其他人所评论的那样,三项案例是一种非常讨厌的晦涩技巧,只有在性能至关重要且问题非常具体时才应使用。
我认为断言只是试图确认满足前提条件,即除了一个之外,所有数字都是三元组。这不是万无一失的。
推荐阅读
- python - 如何在 pyenv 中创建一个 post virtualenv 挂钩来升级 pip 包
- reactjs - 无法访问 .env 中的变量键(dotenv 包 React)
- mailchimp - 使用 Mailchimp 的 API 发送邮件
- mysql - 如何在 node.js 中模拟 PROTOCOL_CONNECTION_LOST 错误?
- python - 如何在python中集成包含r的一阶导数的r函数?
- java - JavaPlot中的反向轴
- java - 使用 DataSource (Java Eclipse) 时“找不到适合 jdbc 的驱动程序”
- matlab - How to draw many rectangles in Matlab?
- reactjs - gh-pages 在“运行部署”上失败
- kubernetes - 无法使 RBAC 在 Minikube 上工作:确保您的网络清单支持 RBAC