[PYTHON] Beim Inkrementieren des Werts eines Schlüssels, der nicht vorhanden ist

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)

Umgebung

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

Fehlermuster

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
Problemumgehung

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

Fehlermuster

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'
'''
Problemumgehung 1

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}
Problemumgehung 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})
Problemumgehung 3

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

Fehlermuster

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}
*/
Problemumgehung 1 (nicht empfohlen)

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}
Problemumgehung 2

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}
Problemumgehung 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}
Bemerkungen

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}

Ende

Ich werde wahrscheinlich von Leuten in jeder Sprache erstochen: whale2:

Referenzen und Hinweise

Recommended Posts

Beim Inkrementieren des Werts eines Schlüssels, der nicht vorhanden ist
Verarbeitung, wenn die Schlüsseleingabe von Python-Pygame nicht gut funktioniert.
Grep, damit grep zum Zeitpunkt von grep nicht angezeigt wird
So erstellen Sie eine neue Datei, wenn die angegebene Datei nicht vorhanden ist - schreiben Sie, wenn die Datei vorhanden ist
Wenn sich eine Zeichenfolge einer bestimmten Reihe im Schlüssel des Wörterbuchs befindet, wird die Zeichenfolge in den Wert des Wörterbuchs konvertiert.
Die Geschichte der Release-Arbeit der Anwendung, die Google nicht erzählt
Suchthinweis: max (max (Liste)) darf nicht verwendet werden, wenn der Wert eines zweidimensionalen Arrays maximiert wird
Der Fehler beim Aufrufen des tkinter-Moduls in einem Texteditor funktioniert nicht wie erwartet
Der Wert von pyTorch torch.var () wird nicht verteilt
Es wird gesagt, dass libmysqlclient.so.18 nicht existiert
Die boolesche Python-Operation gibt keinen booleschen Wert zurück
Beispiel, was zu tun ist, wenn das Beispielskript nicht funktioniert (OpenCV-Python)
Es scheint, dass die Version von Pyflakes nicht die neueste ist, wenn flake8 installiert ist
Über das Problem, dass die Python-Version von Google App Engine nicht ineinander greift
Lösung für das Problem, dass der Build bei der Installation von OpenCV (PEP517) nicht beendet wird
EOFError: EOF beim Lesen einer Zeile ist nicht auf den Standardeingabewert eingestellt
[Bot dekodieren] Ich habe versucht, einen Bot zu erstellen, der mir den Rassenwert von Pokemon angibt
Eine Geschichte, die den Aufwand für Betrieb / Wartung reduziert
[Python] Ein Programm, das die Anzahl der Täler zählt
Schlüsseleingabe, die nicht auf Schlüsseleingabe in Python wartet
Seien Sie vorsichtig, wenn Sie die Eigenvektoren einer Matrix unterscheiden
Lösung, wenn Linux die eingebaute Kamera nicht erkennt
Erstellen Sie einen BOT, der die Discord-URL verkürzt
Tiefes Lernen! Die Geschichte der Daten selbst, die gelesen werden, wenn sie nach der handschriftlichen Nummernerkennung nicht folgen
#Eine Funktion, die den Zeichencode einer Zeichenfolge zurückgibt
Der Rückgabewert (Generator) einer Funktion, die endlich und Ausbeute kombiniert, darf nicht direkt an next übergeben werden
Überprüfen Sie, wann die Version nicht in pyenv wechselt
Erzeugen Sie diese Form des Bodens einer Haustierflasche
Es gibt ein Muster, das das Programm bei Verwendung von Python-Threading nicht gestoppt hat
Die Geschichte, dass der Rückgabewert von tape.gradient () None war
Eine Geschichte, die die Lieferung von Nico Nama analysierte.
[Python] Ein Programm, das die Positionen von Kängurus vergleicht.
Der Wert von meta beim Angeben einer Funktion ohne Rückgabewert mit Dask dataframe gilt
Ruft den Wert eines bestimmten Schlüssels bis zum angegebenen Index der Wörterbuchliste in Python ab
Über die Angelegenheit, dass Nosetests nicht bestanden werden, wenn __init__.py im Projektverzeichnis erstellt wird
Über den Inhalt von wscript beim Erstellen einer solchen D-Sprachumgebung mit Waf
Die Geschichte, dass pyenv den Python-Ausführungsbefehl PATH nicht bestanden hat
Ein Werkzeug, das die Gacha von Soshage automatisch dreht
Code, der bei AttributeError Standardwerte festlegt
Suchen Sie den Index des Maximalwerts (Minimalwerts) eines mehrdimensionalen Arrays
Ein Programm, das nur die Esc-Taste drückt und loslässt
Überprüfen Sie, ob der Docker-Container keine Verbindung zum Internet herstellt
Extrahieren Sie den Wert von dict oder list als Zeichenfolge
Python-Skript, das den Inhalt zweier Verzeichnisse vergleicht
Ich möchte ausgeben, während der Wert des Typs (z. B. datetime) konvertiert wird, der bei der Ausgabe von json mit Python nicht unterstützt wird
Ich habe versucht, eine Methode zur Berechnung des Bewertungsindex (Spezifität, NPV) zu implementieren, die scikit-learn nicht hat
Dekorateur, der AWS-SNS benachrichtigt, wenn die Funktion nicht innerhalb der angegebenen Zeit beendet wird
Die Geschichte, dass die Version von Python 3.7.7 nicht an Heroku angepasst wurde
pandas Ruft den Namen einer Spalte ab, die ein bestimmtes Zeichen enthält
Finden Sie den optimalen Wert der Funktion mit einem genetischen Algorithmus (Teil 2)
Die Geschichte, dass ein Hash-Fehler bei der Verwendung von Pipenv auftrat
Eine Formel, die einfach das Alter ab dem Geburtsdatum berechnet
Erklären Sie den Mechanismus von Linux, den Sie nicht unerwartet kennen
Lösung, wenn die Hintergrundabdeckung von VS Code für Linux nicht funktioniert
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
So ermitteln Sie die Speicheradresse des Pandas-Datenrahmenwerts
Die Geschichte der Erstellung einer Website, auf der die Veröffentlichungsdaten von Büchern aufgeführt sind
Das Problem, dass die Version von Vue CLI nicht gestartet wurde