[RUBY] Lors de l'incrémentation de la valeur d'une clé qui n'existe pas

Bonsoir: baleine2: Que dois-je faire avec un échantillon qui écrit un processus tel que dictionary [key] + = 1 dans chaque langue et une langue qui affiche un message tel que" Il n'y a pas de clé de ce type "dans ce processus? (Difficile à transmettre)

environnement

L'environnement d'exécution est le suivant.

environnement


#Ordinateur
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.12.1
BuildVersion:	16B2555

# Ruby
$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin16]

# Perl
$ perl -v | grep v5
This is perl 5, version 24, subversion 0 (v5.24.0) built for darwin-thread-multi-2level

# Perl6
$ perl6 -v
This is Rakudo version 2016.07.1 built on MoarVM version 2016.07
implementing Perl 6.c.

# Python
$ python --version
Python 3.5.1 :: Anaconda 4.1.0 (x86_64)

# PHP5
$ php -v
PHP 5.6.25 (cli) (built: Sep  6 2016 16:37:16)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

Ruby

Modèle d'erreur

Erreur


target = %w[a a b b c 0 1 1 1]
count = {}

target.each{|var|
  count[ var ] += 1
}

puts count
=begin
#=>Erreur
inc.rb:5:in `block in <main>': undefined method `+' for nil:NilClass (NoMethodError)
	from inc.rb:4:in `each'
	from inc.rb:4:in `<main>'
=end
solution de contournement

Le rubis est magnifique.

inc.rb


target = %w[a a b b c 0 1 1 1]
count = Hash.new(0) #Définir la valeur initiale

target.each{|var|
  count[ var ] += 1
}

puts count #=> {"a"=>2, "b"=>2, "c"=>1, "0"=>1, "1"=>3}

inc2.rb


target = %w[a a b b c 0 1 1 1]
count = {}
count.default = 0 #Définir la valeur initiale

target.each{|var|
  count[ var ] += 1
}

puts count #=> {"a"=>2, "b"=>2, "c"=>1, "0"=>1, "1"=>3}

Python

Modèle d'erreur

Erreur


target = 'a a b b c 0 1 1 1'.split(' ')
count = {}

for var in target:
    count[ var ] += 1

print( count )
'''
#=>Erreur
Traceback (most recent call last):
  File "inc.py", line 6, in <module>
    count[ var ] += 1
KeyError: 'a'
'''
Solution de contournement 1

Python semble avoir un meilleur moyen.

inc.py


target = 'a a b b c 0 1 1 1'.split(' ')
count = {}

for var in target:
    count.setdefault( var, 0 )
    count[ var ] += 1

print( count ) #=> {'a': 2, '1': 3, '0': 1, 'c': 1, 'b': 2}
Solution de contournement 2

Comment utiliser defaultdict (). @Mpyw m'a dit dans les commentaires.

Python::inc2.py


from collections import defaultdict

target = 'a a b b c 0 1 1 1'.split(' ')
count = defaultdict(int)

for var in target:
    count[ var ] += 1

print( count ) #=> defaultdict(<class 'int'>, {'b': 2, '1': 3, '0': 1, 'a': 2, 'c': 1})
Solution de contournement 3

Comment écrire la gestion des exceptions. Cela semble s'appliquer à n'importe quelle langue. Agréable.

inc3.py


target = 'a a b b c 0 1 1 1'.split(' ')
count = {}

for var in target:
    try:
        count[ var ] += 1
    except KeyError:
        count[ var ] = 1

print( count )

PHP

Modèle d'erreur

J'obtiens un message de notification d'index non défini, bien que ce ne soit pas une erreur. ~~ ʻerror_reporting (-1); `doit être écrit ~~

Notice


<?php
error_reporting( -1 );

$target = explode(' ', 'a a b b c 0 1 1 1');
$count = [];

foreach( $target as $var ){
  $count[ $var ] += 1;
}

echo json_encode( $count ) . PHP_EOL ;
/*
#=>
Notice: Undefined index: a in /Users/yuhei/inc.php on line 8

Notice: Undefined index: b in /Users/yuhei/inc.php on line 8

Notice: Undefined index: c in /Users/yuhei/inc.php on line 8

Notice: Undefined offset: 0 in /Users/yuhei/inc.php on line 8

Notice: Undefined offset: 1 in /Users/yuhei/inc.php on line 8
{"a":2,"b":2,"c":1,"0":1,"1":3}
*/
Solution de contournement 1 (non recommandée)

Ne supprimez pas l'erreur (commandement)

non recommandé


<?php
error_reporting( -1 );

$target = explode(' ', 'a a b b c 0 1 1 1');
$count = [];

foreach( $target as $var ){
  @$count[ $var ] += 1; #Suppression des erreurs
}

echo json_encode( $count ) . PHP_EOL ; #=> {"a":2,"b":2,"c":1,"0":1,"1":3}
Solution de contournement 2

Remplacez 1 s'il n'y a pas de clé. Ajout d'une branche conditionnelle.

isset()


<?php
error_reporting( -1 );

$target = explode(' ', 'a a b b c 0 1 1 1');
$count = [];

foreach( $target as $var ){
  if( isset( $count[ $var ] ) ){
    $count[ $var ] += 1;
  }
  else{
    $count[ $var ] = 1;
  }
}

echo json_encode( $count ) . PHP_EOL ; #=> {"a":2,"b":2,"c":1,"0":1,"1":3}
Solution de contournement 3

Pour cet exemple, je pense que la fonction intégrée ʻarray_count_values () `est bonne.

array_count_values()


<?php
error_reporting( -1 );

$target = explode(' ', 'a a b b c 0 1 1 1');

$count = array_count_values( $target );

echo json_encode( $count ) . PHP_EOL ; #=> {"a":2,"b":2,"c":1,"0":1,"1":3}
Remarques

ʻAssignez 1 s'il n'y a pas de clé dans array_count_values () `. Incrémenter s'il y a une clé. Il semble que le processus est en cours. (C'est aussi bien de vérifier que la clé est un nombre ou une chaîne)

C:php-5.6.27/ext/standard/array.c


/* {{{ proto array array_count_values(array input)
   Return the value as key and the frequency of that value in input as value */
PHP_FUNCTION(array_count_values)
{
        zval    *input,                 /* Input array */
                        **entry,                /* An entry in the input array */
                        **tmp;
        HashTable *myht;
        HashPosition pos;

        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &input) == FAILURE) {
                return;
        }

        /* Initialize return array */
        array_init(return_value);

        /* Go through input array and add values to the return array */
        myht = Z_ARRVAL_P(input);
        zend_hash_internal_pointer_reset_ex(myht, &pos);
        while (zend_hash_get_current_data_ex(myht, (void **)&entry, &pos) == SUCCESS) {
                if (Z_TYPE_PP(entry) == IS_LONG) {
                        if (zend_hash_index_find(Z_ARRVAL_P(return_value), Z_LVAL_PP(entry), (void **)&tmp) == FAILURE) {
                                zval *data;
                                MAKE_STD_ZVAL(data);
                                ZVAL_LONG(data, 1);
                                zend_hash_index_update(Z_ARRVAL_P(return_value), Z_LVAL_PP(entry), &data, sizeof(data), NULL);
                        } else {
                                Z_LVAL_PP(tmp)++;
                        }
                } else if (Z_TYPE_PP(entry) == IS_STRING) {
                        if (zend_symtable_find(Z_ARRVAL_P(return_value), Z_STRVAL_PP(entry), Z_STRLEN_PP(entry) + 1, (void**)&tmp) == FAILURE) {
                                zval *data;
                                MAKE_STD_ZVAL(data);
                                ZVAL_LONG(data, 1);
                                zend_symtable_update(Z_ARRVAL_P(return_value), Z_STRVAL_PP(entry), Z_STRLEN_PP(entry) + 1, &data, sizeof(data), NULL);
                        } else {
                                Z_LVAL_PP(tmp)++;
                        }
                } else {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can only count STRING and INTEGER values!");
                }

                zend_hash_move_forward_ex(myht, &pos);
        }
}
/* }}} */

Perl Perl mieux qui ne provoque pas d'erreur

inc.pl


use v5.24;
use warnings;
use Data::Dumper;

my @target = qw[a a b b c 0 1 1 1];
my %count;

for my $var ( @target ){
  $count{ $var } += 1;
}

print Dumper \%count;
__DATA__
#=>
$VAR1 = {
          'c' => 1,
          '1' => 3,
          'b' => 2,
          'a' => 2,
          '0' => 1
        };

Perl6 Perl 6 best (ry) qui ne provoque pas d'erreur

inc.pl6


use v6;

my @target = <a a b b c 0 1 1 1>;
my %count;

for @target -> Str $var {
  %count{ $var } += 1;
}

%count.say; #=> {0 => 1, 1 => 3, a => 2, b => 2, c => 1}

fin

Susceptible d'être poignardé par des personnes dans chaque langue: baleine2:

Références et notes

Recommended Posts

Lors de l'incrémentation de la valeur d'une clé qui n'existe pas
Traitement lorsque l'entrée clé de pygame Python ne se passe pas bien.
Grep pour que grep n'apparaisse pas au moment de grep
Comment créer un nouveau fichier lorsque le fichier spécifié n'existe pas - Ecrire si le fichier existe
Lorsqu'une chaîne de caractères d'une certaine série se trouve dans la clé du dictionnaire, la chaîne de caractères est convertie en valeur du dictionnaire.
L'histoire du travail de sortie de l'application que Google ne raconte pas
Note addictive: max (max (list)) ne doit pas être utilisé lors de la maximisation de la valeur d'un tableau à deux dimensions
Erreur lors de l'appel du module tkinter dans un éditeur de texte ne fonctionne pas comme prévu
La valeur de pyTorch torch.var () n'est pas distribuée
On dit que libmysqlclient.so.18 n'existe pas
Les opérations booléennes python ne renvoient pas de valeurs booléennes
Exemple de ce qu'il faut faire lorsque l'exemple de script ne fonctionne pas (OpenCV-Python)
Il semble que la version de pyflakes ne soit pas la dernière lorsque flake8 est installé
À propos du problème que la version python de Google App Engine ne maille pas
Solution au problème qui ne se termine pas lors de l'installation d'OpenCV (PEP517)
EOFError: EOF lors de la lecture d'une ligne n'est pas réglé sur la valeur d'entrée standard
[Discode Bot] J'ai essayé de créer un Bot qui me dit la valeur de race de Pokemon
Une histoire qui réduit l'effort de fonctionnement / maintenance
[Python] Un programme qui compte le nombre de vallées
Entrée clé qui n'attend pas l'entrée clé en Python
Soyez prudent lors de la différenciation des vecteurs propres d'une matrice
Solution lorsque Linux ne reconnaît pas la caméra intégrée
Créez un BOT qui raccourcit l'URL Discord
L'apprentissage en profondeur! L'histoire des données elles-mêmes qui sont lues lorsqu'elles ne suivent pas après la reconnaissance des nombres manuscrits
#Une fonction qui renvoie le code de caractère d'une chaîne de caractères
La valeur de retour (générateur) d'une fonction qui combine finally et yield ne doit pas être passée directement à next
Vérifier quand la version ne change pas dans pyenv
Générer cette forme du fond d'une bouteille pour animaux de compagnie
Il y a un modèle que le programme ne s'est pas arrêté lors de l'utilisation du thread Python
L'histoire selon laquelle la valeur de retour de tape.gradient () était None
Une histoire qui a analysé la livraison de Nico Nama.
[Python] Un programme qui compare les positions des kangourous.
La valeur de meta lors de la spécification d'une fonction sans valeur de retour avec Dask dataframe s'applique
Obtenir la valeur d'une clé spécifique jusqu'à l'index spécifié de la liste de dictionnaires en Python
À propos du problème que nosetests ne passe pas lorsque __init__.py est créé dans le répertoire du projet
À propos du contenu de wscript lors de la création d'un environnement en langage D comme celui avec Waf
L'histoire selon laquelle pyenv n'a pas passé la commande d'exécution python PATH
Un outil qui transforme automatiquement le gacha de Soshage
Code qui définit les valeurs par défaut en cas d'AttributeError
Trouver l'index de la valeur maximale (valeur minimale) d'un tableau multidimensionnel
Un programme qui appuie et relâche simplement la touche Échap
Vérifier quand le conteneur Docker ne se connecte pas à Internet
Extraire la valeur de dict ou list sous forme de chaîne de caractères
Script Python qui compare le contenu de deux répertoires
Je souhaite générer une sortie lors de la conversion de la valeur du type (par exemple, datetime) qui n'est pas pris en charge lors de la sortie de json avec python
J'ai essayé d'implémenter une méthode pour calculer l'indice d'évaluation (spécificité, NPV) que scikit-learn n'a pas
Décorateur qui notifie sur AWS-SNS si la fonction ne se termine pas dans le délai spécifié
L'histoire selon laquelle la version de python 3.7.7 n'était pas adaptée à Heroku
pandas Récupère le nom d'une colonne contenant un caractère spécifique
Trouvez la valeur optimale de la fonction à l'aide d'un algorithme génétique (partie 2)
L'histoire de l'erreur de hachage est apparue lors de l'utilisation de Pipenv
Une formule qui calcule simplement l'âge à partir de la date de naissance
Expliquer le mécanisme de Linux que vous ne connaissez pas de manière inattendue
Solution lorsque la couverture de fond de VS Code pour Linux ne fonctionne pas
Une fonction qui mesure le temps de traitement d'une méthode en python
Comment trouver l'adresse mémoire de la valeur de la trame de données Pandas
L'histoire de la création d'un site qui répertorie les dates de sortie des livres
Le problème que la version de Vue CLI n'a pas augmenté