Perl->Python, String indiziertes Array

Mickey Mouse

Admiral
Registriert
Aug. 2006
Beiträge
9.940
ich habe von Python leider keine Ahnung und habe bisher eigentlich immer nur Perl genutzt (außer ich kann es schnell mit awk machen ;) )

ich möchte ein "zwei dimensionales" Array per Strings/Zeichen indizieren.
in Perl wäre das eine recht triviale Sache, hier ein Beispiel:
Code:
$x='A';
$y='B';
${$x}{$x}="Test1";
${$x}{$y}="Test2";
${$y}{$x}="Zwei-1";
${$y}{$y}="Zwei-2";
print "->   $A{'A'}\n";
print "-->  $$x{$y}\n";
print "---> $B{$x}\n";

wie kann man das (möglichst 1:1 bzw. "so ähnlich wie möglich") in Python übersetzen?

die Beispiele, die ich dazu gefunden habe, beziehen sich auf "Dictonaries" und nicht auf Arrays. Da werden immer Tupel abgelegt und das ganze scheint nicht so einfach/logisch und selbsterklärend wie in Perl zu sein :(
 
https://docs.python.org/3/tutorial/datastructures.html#dictionaries
"Dictionaries are sometimes found in other languages as “associative memories” or “associative arrays”."

Python:
x = 'A'
y = 'B'
z = {x: {x: 'Test1', y: 'Test2'}, y: {x: 'Zwei-1', y: 'Zwei-2'}}

print(z[x][x], z[x][y], z[y][x], z[y][y], z['A']['B'])


wenns nicht assoziativ sein soll geht natürlich auch
Python:
z = [['Test1', 'Test2'], ['Zwei-1', 'Zwei-2']]
print(z[0][0], z[0][1], z[1][0], z[1][1])
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Mickey Mouse
danke!
ich habe mich davon verwirren lassen, dass bei meinen Tests im Zusammenhang mit "eckigen Klammern" immer die Fehlermeldung kam, dass das nur mit Integers erlaubt sei.
es sieht so aus, als ob das von der "Vorgeschichte" (in diesem Fall z) abhängt und man anhand einer einzelnen Zeile nicht sagen kann, ob das jetzt syntaktisch richtig ist oder nicht.

und an die vielen verschiedenen Bedeutungen vom Doppelpunkt muss ich mich wohl auch noch gewöhnen ;)
 
du kannst das ganze natürlich auch ausführlich schreiben
Python:
x = 'A'
y = 'B'

z = {}
z[x] = {}
z[y] = {}
z[x][x] = 'Test1'
z[x][y] = 'Test2'
z[y][x] = 'Zwei-1'
z[y][y] = 'Zwei-2'

sieht nur nicht sehr "pythonic" aus :)
 
brauche ich die Zeilen 5&6 bzw. muss ich das 26x machen, wenn das ganze Alphabet durchgehen möchte?!?
 
na sowas macht man doch nicht mehr manuell:
Python:
import string

z = {}                                     

for c1 in string.ascii_lowercase:
    z[c1] = {}
    for c2 in string.ascii_lowercase:
        z[c1][c2] = 'test_%s_%s' % (c1, c2)

print(z)
 
naja, in Perl brauche ich den "Umweg" über z gar nicht gehen und somit auch nichts zu deklarieren oder definieren...

in dem speziellen Fall, um den es mir gerade geht, kenne ich den scope und es ist OK so wie du es vorschlägst, aber generell ist das Perl Beispiel doch wesentlich flexibler, das kann man mit beliebigen Daten füttern.

so wie ich das sehe, könnte ich auch mit vars() arbeiten, aber das wird mir zu kompliziert, wie gesagt, dein Vorschlag tut es für mein Problem, danke!
 
Mickey Mouse schrieb:
in Perl wäre das eine recht triviale Sache, hier ein Beispiel:
Code:
$x='A';
$y='B';
${$x}{$x}="Test1";
${$y}{$x}="Zwei-1";
print "->   $A{'A'}\n";
print "---> $B{$x}\n";
Du tust hier so, als wäre obiges in Perl eine "triviale Sache". Das ist es nicht. Was Du beschreibst, ist ein "Überbleibsel" aus Perl-4-Zeiten, das "implicit import of variable names into ::main namespace", gepaart mit "autovivifivation". Das hat man in der alten Zeit viel gemacht, heute geht das nur noch mit Skalaren, wenn denn 'no strict refs' gesetzt ist. Ansonsten würdest Du in jedem modernen Perl-Umfeld für solchen Code gesteinigt. So würde Dein Schnipsel in normalem Perl aussehen:
Perl:
use strict;
use warnings;

my ($x, $y)  = qw(A B);
$_->{$x}{$x} = 'Test1';  
$_->{$x}{$y} = 'Test2'; 
$_->{$y}{$x} = 'Zwei-1'; 
$_->{$y}{$y} = 'Zwei-2'; 

print "->   $_->{A}{A}\n";
print "-->  $_->{$x}{$y}\n";
print "---> $_->{B}{$x}\n";
Alles spielt sich nun im impliziten Hash (bzw. dictionary) %_ ab, auf welchen mit $_->{ ... } zugegriffen wird. Dein Quelltext ist heute leider nicht mehr tragbar :freak:
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Tumbleweed
tut aber ohne Probleme und ich lebe gerne in der alten Zeit, solange es keine Nachteile hat ;)
ich bin kein Programmierer, sondern setze solche (minimalistischen) Werkzeuge nur immer mal als Mittel zum Zweck ein.
mir ist aber auch bewusst, dass für viele Leute hauptsächlich der Weg das Ziel darstellt...
 
Mickey Mouse schrieb:
mir ist aber auch bewusst, dass für viele Leute hauptsächlich der Weg das Ziel darstellt...
Kein Ziel ohne Weg, kein Weg ohne Ziel.
 
Zurück
Oben