2
votes

conversion de valeurs de différents types dans un dictionnaire

Celui-ci fonctionne:

d2:()!()
d2[`t1]:2017.01.01
d2[`t2]:2018.01.01
d2[`idx]:42

Mais celui-ci échoue (erreur de type):

d1:`t1`t2`idx!(2017.01.01;2018.01.01;42)

Y a-t-il une solution de contournement? Pour une meilleure lisibilité, j'aimerais renseigner le dictionnaire clé par clé (ligne par ligne). En réalité, c'est plus long.

kdb

0 commentaires

3 Réponses :


5
votes

Lorsque vous définissez le dictionnaire comme d: ()! () , la première chose que vous insérez (dans ce cas une date) fera que le type du dictionnaire ne prendra que des valeurs de type -14h .

La pratique standard consiste à initialiser le dict avec une valeur non typée pour empêcher la valeur de devenir un simple vecteur

q)d2:enlist[`]!enlist(::)
q)d2[`t1]:2017.01.01
q)d2[`t2]:2018.01.01
q)d2[`idx]:42
q)d2
   | ::
t1 | 2017.01.01
t2 | 2018.01.01
idx| 42


0 commentaires

3
votes

La première approche définit un dictionnaire général dont les valeurs sont une liste générale, ce qui signifie qu'il peut stocker des valeurs de tout type. Ceci est également utilisé pour définir des tables car les tables peuvent stocker des colonnes de types différents.

Dans la deuxième approche, lorsque vous insérez la première valeur dans le dictionnaire, cela définit le type de liste de valeurs du dictionnaire sur ce type d'élément. C'est donc une simple liste maintenant.

  q) d2[`t2]:2018.01.01
  q) d2[`idx]:42

Cela signifie que maintenant les valeurs du dictionnaire ne peuvent pas être une liste générale et ne peuvent y stocker que des éléments de type date.

Pour créer un dictionnaire général (qui stocke liste générale en tant que valeurs) insère la première valeur d'entrée comme nulle (: :). C'est ce qui est utilisé par les dictionnaires d'espaces de noms.

  q)  d2: ()!()
  q)  d2[`]:(::) 

Il peut désormais stocker n'importe quelle valeur.

  q) d2: ()!()
  q) d2[`t1]:2017.01.01
  q) type value d2  / 14h


0 commentaires

1
votes

Alternativement, vous pouvez concaténer les 2 dictionnaires au lieu d'ajouter l'entrée. Ceci est pratique lorsque vous devez ajouter quelque chose à un dictionnaire existant. Ce n'est pas exactement le scénario des OP, mais il correspond au titre et donc d'autres personnes qui arrivent ici peuvent le trouver utile.

d2:()!()
d2[`t1]:2017.01.01
d2[`t2]:2018.01.01
d2:d2,(enlist `idx)!(enlist 42)
d2

t1 | 2017.01.01
t2 | 2018.01.01
idx| 42


0 commentaires