python - 在二维列表中交换 0 和 1 的最快方法

标签 python list nested-lists

假设我有一个矩阵:

[[1, 1, 1, 0, 0,], [0, 1, 0, 1], [1, 0, 1]]

我想将其更改为:

[[0, 0, 0, 1, 1,], [1, 0, 1, 0], [0, 1, 0]]

处理这种情况最快的方法是什么?

目前,我在另一个for循环中使用for循环,如下所示,这显然太慢了。

for my_row in my_mat:
   for my_val in my_row:
      my_val = 1 if my_val == 0 else 0

最佳答案

我不认为它很慢,但它不是最快的。这里有一些更快的替代方案。

减法( super 简单)

>>> [[1 - j for j in i] for i in lst]
[[0, 0, 0, 1, 1], [1, 0, 1, 0], [0, 1, 0]]

这消除了对 if 检查的需要。不过,只有当您有一个 0/​​1 列表并且您只想翻转这些值时,这才有意义。


异或位翻转

>>> [[j ^ 1 for j in i] for i in lst]
[[0, 0, 0, 1, 1], [1, 0, 1, 0], [0, 1, 0]]

XOR 运算通常很快,因此如果您的正值超过 1,这是一个很好的选择。


反转

>>> [[int(not j) for j in i] for i in lst]
[[0, 0, 0, 1, 1], [1, 0, 1, 0], [0, 1, 0]]

请注意,这会将非零值压缩为 1。not 将整数转换为 truthy/falsy 值,随后的 intFalse0,或 True1


如果您对此处建议的所有方法的性能感兴趣,

lst = np.random.choice(2, (1000, 1000)).tolist()

%timeit [[int(not j) for j in i] for i in lst]
%timeit [[j ^ 1 for j in i] for i in lst]
%timeit [[1 - j for j in i] for i in lst]

10 loops, best of 3: 175 ms per loop
10 loops, best of 3: 89.8 ms per loop
10 loops, best of 3: 61.1 ms per loop

关于python - 在二维列表中交换 0 和 1 的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48351204/

相关文章:

java - 过滤映射并返回键列表

Python 解压命名元组的二维列表

python - Tensorflow 2.0 中已弃用标志,最好的替代方案是什么?

python - Django - 扩展用户配置文件,对象不存在,如何创建空白记录?

c# - 两个列表的区别 C#

jQuery 显示/隐藏常见问题列表元素的切换器

python - 循环时修改字符串

python - 导入不工作

python - pandas DataFrame 的嵌套列表字典

python - 在字典中的另一个列表中查找列表的最大长度