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)
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
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
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
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'
'''
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}
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})
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
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}
*/
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}
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}
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}
ʻ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}
Susceptible d'être poignardé par des personnes dans chaque langue: baleine2:
Recommended Posts