REQ: Small Perl to Python conversion needed

K

Koncept

Howdie Python folks! I am very new to Python ( 3rd day now ) and it has
already earned its place as my fav. language to work in. I hope to
continue, and I really would appreciate some good resources if anybody
would care to contribute.

My current head-scratcher concerns something I can do in Perl which I
would like to have duplicated for Python. I have noticed that it is not
possible to increment an unset value in Python, so I would like to know
how to duplicate the following bit of code using Python dictionaries.

#!/usr/bin/perl

# Parse comma delimited lines and create a final frequency hash
# Real example would read a file line by line
my %dict = {};
my @lines = ( "1,2,3,4,5", "2,3,4,5", "3,4,5", "4,5", "5" );
foreach(@lines) { map( $dict{ $_ }++, split( "," ) ); }
foreach( sort byKeys keys %dict ) {
print "Key: $_\tFrequency: ", "*" x $dict{ $_ }, "\n"
if $dict{ $_ } =~ /\d+/g;
}
sub byKeys { $dict{$b} <=> $dict{$a} }

__DATA__
Results:
Key: 5 Frequency: *****
Key: 4 Frequency: ****
Key: 3 Frequency: ***
Key: 2 Frequency: **
Key: 1 Frequency: *
 
S

Steven Bethard

Koncept said:
#!/usr/bin/perl

# Parse comma delimited lines and create a final frequency hash
# Real example would read a file line by line
my %dict = {};
my @lines = ( "1,2,3,4,5", "2,3,4,5", "3,4,5", "4,5", "5" );
foreach(@lines) { map( $dict{ $_ }++, split( "," ) ); }
foreach( sort byKeys keys %dict ) {
print "Key: $_\tFrequency: ", "*" x $dict{ $_ }, "\n"
if $dict{ $_ } =~ /\d+/g;
}
sub byKeys { $dict{$b} <=> $dict{$a} }

__DATA__
Results:
Key: 5 Frequency: *****
Key: 4 Frequency: ****
Key: 3 Frequency: ***
Key: 2 Frequency: **
Key: 1 Frequency: *

I don't speak Perl, but based on your output, I'd probably do something
like:

py> lines = ["1,2,3,4,5", "2,3,4,5", "3,4,5", "4,5", "5"]
py> counts = {}
py> for items in lines:
.... for item in items.split(','):
.... counts[item] = counts.get(item, 0) + 1
....
py> for key in sorted(counts, key=counts.__getitem__, reverse=True):
.... print 'Key: %s Frequency: %s' % (key, '*'*counts[key])
....
Key: 5 Frequency: *****
Key: 4 Frequency: ****
Key: 3 Frequency: ***
Key: 2 Frequency: **
Key: 1 Frequency: *

I'm probably missing a few subtleties, but hopefully this will get you
started.

STeVe
 
J

John Machin

Koncept said:
Howdie Python folks! I am very new to Python ( 3rd day now ) and it has
already earned its place as my fav. language to work in. I hope to
continue, and I really would appreciate some good resources if anybody
would care to contribute.

My current head-scratcher concerns something I can do in Perl which I
would like to have duplicated for Python. I have noticed that it is not
possible to increment an unset value in Python, so I would like to know
how to duplicate the following bit of code using Python dictionaries.

[expletives deleted]

freq_dict = {}
....
if thing in freq_dict:
freq_dict[thing] += 1
else:
freq_dict[thing] = 1


or, less plainly,

freq_dict[thing] = freq_dict.get(thing, 0) + 1
 
S

Steven Bethard

John said:
freq_dict = {}
...
if thing in freq_dict:
freq_dict[thing] += 1
else:
freq_dict[thing] = 1

or, less plainly,

freq_dict[thing] = freq_dict.get(thing, 0) + 1

or

try:
freq_dict[thing] += 1
except KeyError:
freq_dict[thing] = 1

STeVe
 
K

Koncept

Steven Bethard said:
I don't speak Perl, but based on your output, I'd probably do something
like:

py> lines = ["1,2,3,4,5", "2,3,4,5", "3,4,5", "4,5", "5"]
py> counts = {}
py> for items in lines:
... for item in items.split(','):
... counts[item] = counts.get(item, 0) + 1
...
py> for key in sorted(counts, key=counts.__getitem__, reverse=True):
... print 'Key: %s Frequency: %s' % (key, '*'*counts[key])
...
Key: 5 Frequency: *****
Key: 4 Frequency: ****
Key: 3 Frequency: ***
Key: 2 Frequency: **
Key: 1 Frequency: *

I'm probably missing a few subtleties, but hopefully this will get you
started.

STeVe


Thanks Steven. This helped a lot. Exactly what I was looking for
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top