Supposons que nous ayons une matrice carrée d'entrée ainsi terminée: et supposons que je souhaite supprimer une "croix" de la matrice (par exemple la première rangée et le premier rang colonne). p> J'ai écrit cette fonction qui fonctionne correctement: p> [[1, 0, 0, 0, 1, 1],
[0, 1, 1, 0, 1, 0],
[0, 1, 1, 1, 0, 1],
[0, 0, 1, 1, 1, 0],
[1, 1, 0, 1, 1, 1],
[1, 0, 1, 0, 1, 1]]
3 Réponses :
Ceci est au moins un peu mieux ...
def eliminate_cross(A, i, j):
A = deepcopy(A)
del A[i]
for row in A:
del row[j]
return A
bien sûr que ça l'est! Cependant, je cherche une sorte de solution d'une ligne. Je pense que vous référez à reconvertir toutes les listes de liste dans une matrice numpie
@ Leos313 [* zip (* [* zip (* _ comp_matrix [1:])] [1:])] code>.
@ Leos313 C'est vraiment laid et ne peut pas supprimer les rangées / colonnes moyennes.
Oui c'est le cas! Si vous changez le 0 avec un autre numéro, vous pouvez généraliser la fonction !! Je n'ai pas testé, mais c'était mon idée originale quand j'ai écrit la question et la fonction de la question
@ LEOS313 Il n'a pas de zéro. Qu'est-ce que tu racontes? :-)
del matrix_copy [0] première ligne, del matrix_copy [1] deuxième ligne et ainsi de suite. La même chose pour la colonne
@ LEOS313 HUH? C'est déjà la réponse. Nous parlions de mon doublure idiot.
Mais oui, j'ai suivi les autres gars pour passer à des paramètres raisonnables maintenant.
Voici une possibilité:
def remove_cross(A,i,j):
return [row[:j] + row[(j+1):] for k,row in enumerate(A) if k != i]
Que diriez-vous de fractionnement A code> comme vous diviser ligne code>?
@superbrain qui aurait une symétrie agréable, mais je ne pense pas que ce serait aussi efficace puisqu'il créerait deux nouvelles listes en mémoire juste pour les déplacer.
Ouais mais tu fais la même chose pour chaque rangée, ce qui n'est pas autant.
Bonjour @johncoleman, puis-je vous demander où puis-je lire sur la "stratégie" utilisée pour écrire ce type de lignes à Python? Merci pour votre patience
@ Leos313 Il existe un livre récent appelé "Python One-Linders" de Christain Mayer, qui semble prometteur. Au-delà de cela, abonnez-vous simplement à la balise code> Python code> sur la pile débordement et voyez comment les questions sont généralement répondues. Un phénomène intéressant est de quelle fréquence la même réponse (ou dans certains cas exactement la même) est donnée par deux personnes ou plus dans quelques minutes de la question posée. J'ai beaucoup appris sur Python en suivant la balise.
Qu'en est-il d'une option pour plus d'une rangée et de col en col à éliminer?
Si vous avez utilisé NUMPY, il serait significativement plus efficace:
np.array (_comp_matrix [1: 1:]) code>Utilisez
del _comp_matrix [0] code> au lieu desupprimer code>.@Mz oui, non. Mais cela signifie également que je devrais convertir la liste de liste -> np.array -> liste de lecture. C'est une solution, non. Lequel est le meilleur? Y a-t-il d'autres moyens pour cela?
@Alexhall à droite. Cependant, mon problème est avec la boucle pour :)
En fonction du problème plus large, vous devriez peut-être utiliser uniquement des numéros. Mais si vous devez travailler avec des listes, vous allez avoir besoin de boucles, ce qui est aussi bon que possible.