diff --git a/qiskit/quantum_info/operators/symplectic/pauli.py b/qiskit/quantum_info/operators/symplectic/pauli.py index 2147a1765948..d51ebceca77f 100644 --- a/qiskit/quantum_info/operators/symplectic/pauli.py +++ b/qiskit/quantum_info/operators/symplectic/pauli.py @@ -363,6 +363,8 @@ def delete(self, qubits: int | list) -> Pauli: """ if isinstance(qubits, (int, np.integer)): qubits = [qubits] + if len(qubits) == 0: + return Pauli((self._z, self._x, self.phase)) if max(qubits) > self.num_qubits - 1: raise QiskitError( "Qubit index is larger than the number of qubits " diff --git a/qiskit/quantum_info/operators/symplectic/pauli_list.py b/qiskit/quantum_info/operators/symplectic/pauli_list.py index a79596e21009..1af3e0d0d7ec 100644 --- a/qiskit/quantum_info/operators/symplectic/pauli_list.py +++ b/qiskit/quantum_info/operators/symplectic/pauli_list.py @@ -376,7 +376,8 @@ def delete(self, ind: int | list, qubit: bool = False) -> PauliList: """ if isinstance(ind, int): ind = [ind] - + if len(ind) == 0: + return PauliList.from_symplectic(self._z, self._x, self.phase) # Row deletion if not qubit: if max(ind) >= len(self): diff --git a/qiskit/quantum_info/operators/symplectic/pauli_table.py b/qiskit/quantum_info/operators/symplectic/pauli_table.py index d28b5b32ab72..6bd3eda9cb95 100644 --- a/qiskit/quantum_info/operators/symplectic/pauli_table.py +++ b/qiskit/quantum_info/operators/symplectic/pauli_table.py @@ -281,7 +281,8 @@ def delete(self, ind: int | list, qubit: bool = False) -> PauliTable: """ if isinstance(ind, (int, np.integer)): ind = [ind] - + if len(ind) == 0: + return PauliTable(self._array) # Row deletion if not qubit: if max(ind) >= self.size: diff --git a/releasenotes/notes/support-empty-delete-for-pauli-16c5c5fae890c16c.yaml b/releasenotes/notes/support-empty-delete-for-pauli-16c5c5fae890c16c.yaml new file mode 100644 index 000000000000..ba7fd7a63c55 --- /dev/null +++ b/releasenotes/notes/support-empty-delete-for-pauli-16c5c5fae890c16c.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + Passing an empty list to the methods :meth:`.Pauli.delete`, :meth:`.PauliList.delete`, + and :meth:`.PauliTable.delete` now returns a copy of the original object instead of throwing an error. diff --git a/test/python/quantum_info/operators/symplectic/test_pauli.py b/test/python/quantum_info/operators/symplectic/test_pauli.py index df7bf9946210..a0c6d4d6330d 100644 --- a/test/python/quantum_info/operators/symplectic/test_pauli.py +++ b/test/python/quantum_info/operators/symplectic/test_pauli.py @@ -224,6 +224,8 @@ def test_insert(self): def test_delete(self): """Test delete method""" pauli = Pauli("IXYZ") + pauli = pauli.delete([]) + self.assertEqual(str(pauli), "IXYZ") pauli = pauli.delete([0, 2]) self.assertEqual(str(pauli), "IY") diff --git a/test/python/quantum_info/operators/symplectic/test_pauli_list.py b/test/python/quantum_info/operators/symplectic/test_pauli_list.py index 379111df5eaa..63e079e55e80 100644 --- a/test/python/quantum_info/operators/symplectic/test_pauli_list.py +++ b/test/python/quantum_info/operators/symplectic/test_pauli_list.py @@ -1495,6 +1495,10 @@ def test_unique(self): def test_delete(self): """Test delete method.""" + with self.subTest(msg="no rows"): + pauli = PauliList(["XX", "ZZ"]) + self.assertEqual(pauli.delete([]), pauli) + with self.subTest(msg="single row"): for j in range(1, 6): pauli = PauliList([j * "X", j * "Y"]) @@ -1508,6 +1512,10 @@ def test_delete(self): self.assertEqual(pauli.delete([1, 2]), PauliList(j * "X")) self.assertEqual(pauli.delete([0, 1]), PauliList(j * "Z")) + with self.subTest(msg="no qubits"): + pauli = PauliList(["XX", "ZZ"]) + self.assertEqual(pauli.delete([], qubit=True), pauli) + with self.subTest(msg="single qubit"): pauli = PauliList(["IIX", "iIYI", "ZII"]) value = pauli.delete(0, qubit=True) diff --git a/test/python/quantum_info/operators/symplectic/test_pauli_table.py b/test/python/quantum_info/operators/symplectic/test_pauli_table.py index 5d51aa2071ae..69fb9d96f4c5 100644 --- a/test/python/quantum_info/operators/symplectic/test_pauli_table.py +++ b/test/python/quantum_info/operators/symplectic/test_pauli_table.py @@ -1136,6 +1136,10 @@ def test_unique(self): def test_delete(self): """Test delete method.""" + with self.subTest(msg="no rows"): + pauli = PauliTable.from_labels(["XX", "YY"]) + self.assertEqual(pauli.delete([]), pauli) + with self.subTest(msg="single row"): for j in range(1, 6): with self.assertWarns(DeprecationWarning): @@ -1151,6 +1155,10 @@ def test_delete(self): self.assertEqual(pauli.delete([1, 2]), PauliTable(j * "X")) self.assertEqual(pauli.delete([0, 1]), PauliTable(j * "Z")) + with self.subTest(msg="no rows"): + pauli = PauliTable.from_labels(["XX", "YY"]) + self.assertEqual(pauli.delete([], qubit=True), pauli) + with self.subTest(msg="single qubit"): with self.assertWarns(DeprecationWarning): pauli = PauliTable.from_labels(["IIX", "IYI", "ZII"])