J'ai créé deux dictionnaires. Chacun est basé sur une requête différente de la même base de données. Il existe une clé et quatre champs de la base de données dans chaque dictionnaire. Je veux trouver toutes les lignes de dict_x qui sont dans DICT_Y.
TypeError: 'type' object does not support item deletion
4 Réponses :
Les étapes pour résoudre le problème seraient à
- Inverser la valeur clé paires des dictionnaires li>
- Identifiez les clés intersectives courantes li>
- boucle à travers les touches et vérifiez si leurs valeurs correspondent à li> ol> blockQuote>
Le code pourrait ressembler à quelque chose comme ci-dessous p>
xxx pré> Voici l'équivalent de la compréhension dict dans Python 3 P>
result_set = {key: dict_x[key] for key in dict_x.keys() & dict_y.keys() if dict_x[key] == dict_y[key]}
Je ne pense pas que cela fonctionnera car les éléments doivent avoir différentes touches basées sur les requêtes que j'ai utilisées pour former les dictionnaires. J'ai besoin de trouver quels articles ont les mêmes valeurs quelles que soient leurs clés. S'il y a un article dont les Vaule n'existent pas dans un dictionnaire, je veux les supprimer.
Vos valeurs sont-elles une tuple ou une liste?
Et si vous avez une ligne de valeurs en double dans la même table?
J'essayais juste de les tirer directement des dictionnaires, alors je pense que la réponse n'est pas non plus? Peut-être que c'est le pas qui me manque ...
Comment les tirez-vous? Vous pouvez faire un type (dict [rangée]) sur l'une des lignes pour vérifier.
Ma requête aurait dû supprimer des doublons (à DICT_Y), donc ce n'est qu'une préoccupation pour DICT_X.
Quelle version de Python?
Vous pouvez inverser les deux dictionnaires, de sorte que le tuple sera maintenant la clé et la clé actuelle deviendra la valeur. Maintenant, vous pouvez faire une intersection définie sur les tuts des deux dict.
Traceback (dernier appel en dernier): fichier "x: /userfolders/annegilligan/autoplots-2/atp-2.py", ligne 99, dans
Essayez d'utiliser SET (LEAST_DICT.KEYS ()) et SET (référence_dict.keys ())
Êtes-vous en mesure d'atteindre la solution que vous attendez?
Je voudrais ajouter tous les cas où les clés inversées sont égales à un nouveau dictionnaire
Commencez par un dictionnaire vide D = {} et commencez à ajouter les paires de la valeur de la clé en boucle. Vous pouvez faire référence à Stackoverflow.com/Questtions/6416131 / ...
>>> dict_a = {'a':[1,1,2,3]}
>>> dict_b = {'b':[1,2]}
>>> for a_key, b_key in zip(dict_a.keys(), dict_b.keys()):
... print [i for i in dict_a[a_key] if i in set(dict_b[b_key])]
...
[1, 1, 2]
Cela ne vous méfiera-t-il si les clés sont différentes?
Il y a un problème avec cette réponse. Et si les colonnes ont des valeurs dupliquées?
Cela fonctionnera tant que les éléments de la matrice seront toujours dans le même ordre.
dict_x = {'hi': ['hi', 'hello'], 'bye': ['good bye', 'bye']}
dict_y = {'hi': ['hello', 'hi']}
dict_z = dict()
for x_key, x_row in dict_x.items():
for y_key, y_row in dict_y.items():
if set(x_row).intersection(y_row):
dict_z[x_key] = y_row
print(dict_z)
Cela pourrait aider, il retournera false si le dict est égal et vrai sinon. Je connais son inverse
def compare_dict(
dict_1: Dict[Any, Any], dict_2: Dict[Any, Any]
):
new_key = any([False if key in dict_1 else True for key in dict_2])
delete_key = any(
[False if key in dict_2 else True for key in dict_1]
)
if new_key or delete_key:
return True
else:
values_mismatch_flag = any(
[
True if v != dict_1[k] else False
for k, v in dict_2.items()
]
)
if values_mismatch_flag:
return True
return False
Que voulez-vous dire par "rangée"? Les dictionnaires n'ont pas de lignes. Ils ont des clés et des valeurs.
De plus, vous comparez
dict_y.values () code> avecdict_x.values () code>. Ceci compare la valeur des valeurs du dictionnaire sur chaque itération - sûrement pas ce que vous voulezPar rangée, je veux dire l'article dictionnaire - j'ai utilisé le mot ligne parce que les dictionnaires ont été formés à partir de requêtes SQL.
la taille du dictionnaire ne changera-t-elle pas pendant l'itération ici ou je manque quelque chose
Donc, si les valeurs d'une clé / ligne de
dict_x code> sont dansdict_y code> alors vous souhaitez supprimer la touche code> code> dedict_x code >?si dict_y.values () non dans dict_x.values () code> devrait être remplacé parsi dict_x [ligne] non dans dict_y.values () code>Donc, si c'est une liste de dictionnaire, votre code regarde plus ou moins bon, vous faites del dict_x [ligne] mais vous ne pouvez pas passer la ligne, vous devez passer l'index de la ligne; Mais soyez prudent, vous supprimez de la même liste que vous êtes une itération, donc cela provoquera le saut d'une ligne, car si vous supprimez la ligne 2, la rangée 3 deviennent la rangée 2 et la prochaine itération, vous le perdrez parce que la prochaine itération sera sur rangée 3
Je souhaite des lignes avec les valeurs de Sames, leurs clés seront différentes.
Je serais également d'accord avec la création d'un nouveau dictionnaire avec la sortie.
J'avais tout simplement des problèmes avec Ajout de ces "lignes" à un nouveau dict.
donnez des exemples d'entrée et de sortie dans vos questions afin de faciliter la tâche des personnes qui répondent