Guten Abend: whale2: Was soll ich mit einem Beispiel tun, das einen Prozess wie "Wörterbuch [Schlüssel] + = 1" in jede Sprache schreibt und eine Sprache, die eine Meldung wie "Es gibt keinen solchen Schlüssel" in diesem Prozess anzeigt? (Schwer zu vermitteln)
Die Ausführungsumgebung ist wie folgt.
Umgebung
#Computer
$ 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
Error
target = %w[a a b b c 0 1 1 1]
count = {}
target.each{|var|
count[ var ] += 1
}
puts count
=begin
#=>Error
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
Ruby ist wunderschön.
inc.rb
target = %w[a a b b c 0 1 1 1]
count = Hash.new(0) #Anfangswert einstellen
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 #Anfangswert einstellen
target.each{|var|
count[ var ] += 1
}
puts count #=> {"a"=>2, "b"=>2, "c"=>1, "0"=>1, "1"=>3}
Python
Error
target = 'a a b b c 0 1 1 1'.split(' ')
count = {}
for var in target:
count[ var ] += 1
print( count )
'''
#=>Error
Traceback (most recent call last):
File "inc.py", line 6, in <module>
count[ var ] += 1
KeyError: 'a'
'''
Python scheint einen besseren Weg zu haben.
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}
Verwendung von defaultdict (). @ Mpyw sagte mir in den Kommentaren.
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})
So schreiben Sie die Ausnahmebehandlung. Es scheint auf jede Sprache anwendbar zu sein. Nett.
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
Ich erhalte eine Meldung "Undefinierter Index", obwohl dies kein Fehler ist.
~~ error_reporting (-1);
muss geschrieben werden, um ~~ herauszukommen
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}
*/
Unterdrücke den Fehler nicht (Gebot)
nicht empfohlen
<?php
error_reporting( -1 );
$target = explode(' ', 'a a b b c 0 1 1 1');
$count = [];
foreach( $target as $var ){
@$count[ $var ] += 1; #Fehlerunterdrückung
}
echo json_encode( $count ) . PHP_EOL ; #=> {"a":2,"b":2,"c":1,"0":1,"1":3}
Ersetzen Sie 1, wenn kein Schlüssel vorhanden ist. Ein bedingter Zweig wurde hinzugefügt.
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}
Ich denke, die eingebaute Funktion array_count_values ()
ist gut für dieses Beispiel.
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}
Ersetzen Sie 1, wenn in "array_count_values ()" kein Schlüssel vorhanden ist. Inkrementieren, wenn ein Schlüssel vorhanden ist. Es scheint, dass der Prozess ausgeführt wird. (Es ist auch schön zu überprüfen, ob der Schlüssel eine Zahl oder eine Zeichenfolge ist)
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 am besten, das verursacht keinen Fehler.
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), das keinen Fehler verursacht
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}
Ich werde wahrscheinlich von Leuten in jeder Sprache erstochen: whale2: