470,638 Members | 1,581 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 470,638 developers. It's quick & easy.

REQ: Small Perl to Python conversion needed


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: *

--
Koncept <<
"The snake that cannot shed its skin perishes. So do the spirits who are
prevented from changing their opinions; they cease to be a spirit." -Nietzsche
Jul 19 '05 #1
5 1214
Koncept wrote:
#!/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
Jul 19 '05 #2
Koncept wrote:
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

Jul 19 '05 #3
Hi All--

John Machin wrote:
how to duplicate the following bit of code using Python dictionaries.


[expletives deleted]

+1 QOTW

Metta,
Ivan
----------------------------------------------
Ivan Van Laningham
God N Locomotive Works
http://www.andi-holmes.com/
http://www.foretec.com/python/worksh...oceedings.html
Army Signal Corps: Cu Chi, Class of '70
Author: Teach Yourself Python in 24 Hours
Jul 19 '05 #4
John Machin wrote:
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
Jul 19 '05 #5
In article <0K********************@comcast.com>, Steven Bethard
<st************@gmail.com> wrote:
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

--
Koncept <<
"The snake that cannot shed its skin perishes. So do the spirits who are
prevented from changing their opinions; they cease to be a spirit." -Nietzsche
Jul 19 '05 #6

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

42 posts views Thread by Fred Ma | last post: by
2 posts views Thread by John F Dutcher | last post: by
4 posts views Thread by Xah Lee | last post: by
31 posts views Thread by surfunbear | last post: by
2 posts views Thread by ajikoe | last post: by
12 posts views Thread by rurpy | last post: by
82 posts views Thread by Edward Elliott | last post: by
2 posts views Thread by Andrew Robert | last post: by
1 post views Thread by Korara | last post: by
???
1 post views Thread by Stoney L | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.