[Tutor] how to delete some quasi-duplicated keys

2011-11-25 Thread lina
>>> pairs
{('66', '69'): 217, ('69', '66'): 75, ('64', '71'): 25}


such as here ('66', '69') and ('69', '66') is one key,

I wanna keep only one and add the value of those two keys, above is a
very simple example:

here is the (failed) code:

for k, v in pairs.items():
if str(k)[1]+str(k)[0] in pairs.keys():
print(pairs[str(k)[1]+str(k)[0]])
pairs[k]+=pairs[str(k)[1]+str(k)[0]]
del pairs[str(k)[1]+str(k)[0]]
print(v,k)


Thanks for any advice,
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] how to delete some quasi-duplicated keys

2011-11-25 Thread Steven D'Aprano

lina wrote:

pairs

{('66', '69'): 217, ('69', '66'): 75, ('64', '71'): 25}


such as here ('66', '69') and ('69', '66') is one key,

I wanna keep only one and add the value of those two keys, above is a
very simple example:



Which one do you want to keep?

If the order ('66', '69') is unimportant, you should use a frozenset 
instead of a tuple. In your code, where you set the pairs in the first 
place, instead of doing:


pair = ('66', '69')  # however you build the pair
pairs[pair] = value

(or how ever you set the initial values), change it to this:

pair = frozenset(('66', '69'))
pairs[pair] = pairs.get(pair, 0) + value




--
Steven

___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] how to delete some quasi-duplicated keys

2011-11-25 Thread Christian Witts

On 2011/11/25 10:41 AM, lina wrote:

pairs

{('66', '69'): 217, ('69', '66'): 75, ('64', '71'): 25}


such as here ('66', '69') and ('69', '66') is one key,

I wanna keep only one and add the value of those two keys, above is a
very simple example:

here is the (failed) code:

 for k, v in pairs.items():
 if str(k)[1]+str(k)[0] in pairs.keys():
 print(pairs[str(k)[1]+str(k)[0]])
 pairs[k]+=pairs[str(k)[1]+str(k)[0]]
 del pairs[str(k)[1]+str(k)[0]]
 print(v,k)


Thanks for any advice,
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor




pairs.items() is fine if it's a small dictionary but for larger ones 
it's going to slow things down as it generates the entire list of items 
before you continue, rather use .iteritems() as it creates an iterator 
which only yields one item at a time making it more efficient.


str(k)[1]+str(k)[0] is string concatenation so your first key tested is 
'6669' and not ('66', '69') as you intended, you would have to create a 
new tuple to get the key you wanted like `if (k[1], k[0]) in 
pairs.keys():`. Also, your check to "in pairs.keys()" is wasteful as you 
generate a new list of keys for every key and you will be better off 
using `in pairs:` directly as it performs a dictionary lookup to test if 
the key exists.


With that in mind, this is how I would re-write that code segment. YMMV

for key in pairs.iterkeys():
# The [::-1] creates a reverse of the iterable so ('66', '69') will 
be ('69', '66')

if key[::-1] in pairs:
try:
# The first instance of the pair gets kept and the reversed 
gets added

pairs[key] += pairs[key[::-1]]
del pairs[::-1]
except KeyError:
print "Key ('%s', '%s') already accumulated)" % key

Hope that helps.

--

Christian Witts
Python Developer
//
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] how to delete some quasi-duplicated keys

2011-11-25 Thread lina
On Fri, Nov 25, 2011 at 5:05 PM, Christian Witts  wrote:
> On 2011/11/25 10:41 AM, lina wrote:
>
> pairs
>
> {('66', '69'): 217, ('69', '66'): 75, ('64', '71'): 25}
>
>
> such as here ('66', '69') and ('69', '66') is one key,
>
> I wanna keep only one and add the value of those two keys, above is a
> very simple example:
>
> here is the (failed) code:
>
> for k, v in pairs.items():
> if str(k)[1]+str(k)[0] in pairs.keys():
> print(pairs[str(k)[1]+str(k)[0]])
> pairs[k]+=pairs[str(k)[1]+str(
> k)[0]]
> del pairs[str(k)[1]+str(k)[0]]
> print(v,k)
>
>
> Thanks for any advice,
> ___
> Tutor maillist  -  Tutor@python.org
> To unsubscribe or change subscription options:
> http://mail.python.org/mailman/listinfo/tutor
>
>
>
> pairs.items() is fine if it's a small dictionary but for larger ones it's
> going to slow things down as it generates the entire list of items before
> you continue, rather use .iteritems() as it creates an iterator which only
> yields one item at a time making it more efficient.
>
> str(k)[1]+str(k)[0] is string concatenation so your first key tested is
> '6669' and not ('66', '69') as you intended, you would have to create a new
> tuple to get the key you wanted like `if (k[1], k[0]) in pairs.keys():`.
> Also, your check to "in pairs.keys()" is wasteful as you generate a new list
> of keys for every key and you will be better off using `in pairs:` directly
> as it performs a dictionary lookup to test if the key exists.
>
> With that in mind, this is how I would re-write that code segment. YMMV
>
> for key in pairs.iterkeys():
>     # The [::-1] creates a reverse of the iterable so ('66', '69') will be
> ('69', '66')

$ python3 dehydron_data_stastic.py | sort -nr
Traceback (most recent call last):
  File "dehydron_data_stastic.py", line 44, in 
for k in pairs.iterkeys():
AttributeError: 'dict' object has no attribute 'iterkeys'

>     if key[::-1] in pairs:
>     try:
>     # The first instance of the pair gets kept and the reversed gets
> added
>     pairs[key] += pairs[key[::-1]]
>     del pairs[::-1]
>     except KeyError:
>     print "Key ('%s', '%s') already accumulated)" % key
>
> Hope that helps.
>
> --
>
> Christian Witts
> Python Developer
>
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


[Tutor] Do loop in Python

2011-11-25 Thread stm atoc
Hi there,

I am a new python user.
I have  a question regarding  do loop.

This is a simple program that I have written:

-
N=10
h=10.0 # [micrometer]
z=-200.0 # [micrometer]
num = 0.05 #m**2/s
dz = 1.0
nuh=[]
tmax=3600
dt=20.
nu=[]height = arange(z*dz,0,dz)

outfile=open('nu.dat','w')
outfile.write('height, nu, nuh')

for z,when in enumerate(height):
   for h in range(10):
   for N in range(10):
   for z in range((N-z)+(N-h)):

   nuh.append(0.01 * exp(-0.05*(z+200.0))*dz) #turbulence
diffusivity m**2/s
   nu.append(num + nuh[z])

---
What I like to do with this program is do loop like the fortran
version of  as follows:

do i = 2, N
 z(i) = z(i-1) +h(i-1)

end do

write(0,*) 'z ', z(1:N)
write(0,*) 'when ', 'nu ','Conc '


do i= 1, N

  nuh(i)= 0.01d0*exp(-0.005d2*(z(i)+200)) ! turbulence diffusivity m**2/s
  nu(i)= num(1) + nuh(i)


end do

--
My problem is I am notable have the curve in the output plot as I have
as a result of  FORTRAN program. What happens is just having a
straight line!
the whole problem is in z part, which is supposed to be changed and i
do not see it!

 So, would it be possible to take a look at it please. any suggestion
would greatly appreciated.

Thank you,
Sue
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] how to delete some quasi-duplicated keys

2011-11-25 Thread Christian Witts

On 2011/11/25 11:15 AM, lina wrote:

On Fri, Nov 25, 2011 at 5:05 PM, Christian Witts  wrote:

On 2011/11/25 10:41 AM, lina wrote:

pairs

{('66', '69'): 217, ('69', '66'): 75, ('64', '71'): 25}


such as here ('66', '69') and ('69', '66') is one key,

I wanna keep only one and add the value of those two keys, above is a
very simple example:

here is the (failed) code:

 for k, v in pairs.items():
 if str(k)[1]+str(k)[0] in pairs.keys():
 print(pairs[str(k)[1]+str(k)[0]])
 pairs[k]+=pairs[str(k)[1]+str(
k)[0]]
 del pairs[str(k)[1]+str(k)[0]]
 print(v,k)


Thanks for any advice,
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor



pairs.items() is fine if it's a small dictionary but for larger ones it's
going to slow things down as it generates the entire list of items before
you continue, rather use .iteritems() as it creates an iterator which only
yields one item at a time making it more efficient.

str(k)[1]+str(k)[0] is string concatenation so your first key tested is
'6669' and not ('66', '69') as you intended, you would have to create a new
tuple to get the key you wanted like `if (k[1], k[0]) in pairs.keys():`.
Also, your check to "in pairs.keys()" is wasteful as you generate a new list
of keys for every key and you will be better off using `in pairs:` directly
as it performs a dictionary lookup to test if the key exists.

With that in mind, this is how I would re-write that code segment. YMMV

for key in pairs.iterkeys():
 # The [::-1] creates a reverse of the iterable so ('66', '69') will be
('69', '66')

$ python3 dehydron_data_stastic.py | sort -nr
Traceback (most recent call last):
   File "dehydron_data_stastic.py", line 44, in
 for k in pairs.iterkeys():
AttributeError: 'dict' object has no attribute 'iterkeys'


 if key[::-1] in pairs:
 try:
 # The first instance of the pair gets kept and the reversed gets
added
 pairs[key] += pairs[key[::-1]]
 del pairs[::-1]
 except KeyError:
 print "Key ('%s', '%s') already accumulated)" % key

Hope that helps.

--

Christian Witts
Python Developer



Ah, should have mentioned .iterkeys() / .itervalues() are in Python 2.x 
and .keys() and .values() have been changed in Py3 to match .iter* from 
Py2.x.


Just change that line to `for key in pairs.keys():` then.
--

Christian Witts
Python Developer
//
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] how to delete some quasi-duplicated keys

2011-11-25 Thread lina
On Fri, Nov 25, 2011 at 5:06 PM, Steven D'Aprano  wrote:
> lina wrote:
>
> pairs
>>
>> {('66', '69'): 217, ('69', '66'): 75, ('64', '71'): 25}
>>
>>
>> such as here ('66', '69') and ('69', '66') is one key,
>>
>> I wanna keep only one and add the value of those two keys, above is a
>> very simple example:
>
>
> Which one do you want to keep?
>
It does not matter, the order is not important,

> If the order ('66', '69') is unimportant, you should use a frozenset instead
> of a tuple. In your code, where you set the pairs in the first place,
> instead of doing:

>
> pair = ('66', '69')  # however you build the pair
> pairs[pair] = value
>
> (or how ever you set the initial values), change it to this:
>
> pair = frozenset(('66', '69'))
> pairs[pair] = pairs.get(pair, 0) + value

I don't get this "pairs.get" part.
 pairs[pair]=pairs.get(pair,0)+parts[2]
TypeError: unsupported operand type(s) for +: 'int' and 'str'


or line in f.readlines():
parts=line.split()
#pair=set((parts[0],parts[1]))
if (parts[0],parts[1]) not in dehydrons.keys():
dehydrons[(parts[0],parts[1])]=parts[2]
occurence[(parts[0],parts[1])]=1
pair=frozenset(('parts[0]','parts[1]'))
pairs[pair]=pairs.get(pair,0)+parts[2]
else:
occurence[(parts[0],parts[1])]+=1

I upload the file in:


https://docs.google.com/open?id=0B93SVRfpVVg3NTg5YTkwMGUtMzdiNi00ZGI2LWE5ZGYtMTFmMTc0OTZhMzZl
https://docs.google.com/open?id=0B93SVRfpVVg3NGQwZDRhNDMtMDUzZi00NDIxLWE2MDAtZGM0ZWEzZDczYTMz

>
>
>
>
> --
> Steven
>
> ___
> Tutor maillist  -  Tutor@python.org
> To unsubscribe or change subscription options:
> http://mail.python.org/mailman/listinfo/tutor
>
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] how to delete some quasi-duplicated keys

2011-11-25 Thread lina
On Fri, Nov 25, 2011 at 5:19 PM, Christian Witts  wrote:
> On 2011/11/25 11:15 AM, lina wrote:
>
> On Fri, Nov 25, 2011 at 5:05 PM, Christian Witts 
> wrote:
>
> On 2011/11/25 10:41 AM, lina wrote:
>
> pairs
>
> {('66', '69'): 217, ('69', '66'): 75, ('64', '71'): 25}
>
>
> such as here ('66', '69') and ('69', '66') is one key,
>
> I wanna keep only one and add the value of those two keys, above is a
> very simple example:
>
> here is the (failed) code:
>
> for k, v in pairs.items():
> if str(k)[1]+str(k)[0] in pairs.keys():
> print(pairs[str(k)[1]+str(k)[0]])
> pairs[k]+=pairs[str(k)[1]+str(
> k)[0]]
> del pairs[str(k)[1]+str(k)[0]]
> print(v,k)
>
>
> Thanks for any advice,
> ___
> Tutor maillist  -  Tutor@python.org
> To unsubscribe or change subscription options:
> http://mail.python.org/mailman/listinfo/tutor
>
>
>
> pairs.items() is fine if it's a small dictionary but for larger ones it's
> going to slow things down as it generates the entire list of items before
> you continue, rather use .iteritems() as it creates an iterator which only
> yields one item at a time making it more efficient.
>
> str(k)[1]+str(k)[0] is string concatenation so your first key tested is
> '6669' and not ('66', '69') as you intended, you would have to create a new
> tuple to get the key you wanted like `if (k[1], k[0]) in pairs.keys():`.
> Also, your check to "in pairs.keys()" is wasteful as you generate a new list
> of keys for every key and you will be better off using `in pairs:` directly
> as it performs a dictionary lookup to test if the key exists.
>
> With that in mind, this is how I would re-write that code segment. YMMV
>
> for key in pairs.iterkeys():
>     # The [::-1] creates a reverse of the iterable so ('66', '69') will be
> ('69', '66')
>
> $ python3 dehydron_data_stastic.py | sort -nr
> Traceback (most recent call last):
>   File "dehydron_data_stastic.py", line 44, in 
> for k in pairs.iterkeys():
> AttributeError: 'dict' object has no attribute 'iterkeys'
>
>     if key[::-1] in pairs:
>     try:
>     # The first instance of the pair gets kept and the reversed gets
> added
>     pairs[key] += pairs[key[::-1]]
>     del pairs[::-1]
>     except KeyError:
>     print "Key ('%s', '%s') already accumulated)" % key
>
> Hope that helps.
>
> --
>
> Christian Witts
> Python Developer
>
>
> Ah, should have mentioned .iterkeys() / .itervalues() are in Python 2.x and
> .keys() and .values() have been changed in Py3 to match .iter* from Py2.x.
>
> Just change that line to `for key in pairs.keys():` then.

for key in pairs.keys():
if key[::-1] in pairs:
pairs[key] += pairs[key[::-1]]
del pairs[key[::-1]]
print(pairs)

Traceback (most recent call last):
  File "dehydron_data_stastic.py", line 47, in 
for key in pairs.keys():
RuntimeError: dictionary changed size during iteration


> --
>
> Christian Witts
> Python Developer
>
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] how to delete some quasi-duplicated keys

2011-11-25 Thread lina
#!/usr/bin/python3

dehydrons={}
pairs={}
#frozen set way pairs
fs_pairs={}
occurence={}
total=0
dictionary={}
candidate_dehydron={}


if __name__=="__main__":

with open("dehydron_refined_data_18.txt","r") as f:
for line in f.readlines():
parts=line.split()
#pair=set((parts[0],parts[1]))
if (parts[0],parts[1]) not in dehydrons.keys():
dehydrons[(parts[0],parts[1])]=parts[2]
occurence[(parts[0],parts[1])]=1
#pair=frozenset(('parts[0]','parts[1]'))
#pairs[pair]=pairs.get(pair,0)+parts[2]
else:
occurence[(parts[0],parts[1])]+=1
#for k, v in dehydrons.items():
#print(k,v)


for k, v in occurence.items():
if v>=25:
#print(v,k)
candidate_dehydron[k]=v
#print("{:.2f}".format(v/2768*100),k)
total+=v
print(total)

for k, v in candidate_dehydron.items():
pairs[k] = v


'''for key in pairs.keys():
if key[::-1] in pairs:
pairs[key] += pairs[key[::-1]]
del pairs[key[::-1]]
print(pairs)'''


#for k, v in pairs.items():
#print(v,k)



I attached the not working code,  Thanks for any advice,


best regards,
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Do loop in Python

2011-11-25 Thread Charles Becker
Sue,

I'm not familiar with FORTRAN, and since I'm not completely sure what you're 
trying to accomplish please take this simply as an 'educated guess'.  

My guess is that you're not getting the curve because Z is only defined to one 
decimal location (1/10th) precision and probably needs higher precision (and is 
likely getting it) in the FORTRAN version.  

http://docs.python.org/tutorial/floatingpoint.html this should help 

Charles

Sent from my iPhone

On Nov 25, 2011, at 2:16 AM, stm atoc  wrote:

> Hi there,
> 
> I am a new python user.
> I have  a question regarding  do loop.
> 
> This is a simple program that I have written:
> 
> -
> N=10
> h=10.0 # [micrometer]
> z=-200.0 # [micrometer]
> num = 0.05 #m**2/s
> dz = 1.0
> nuh=[]
> tmax=3600
> dt=20.
> nu=[]height = arange(z*dz,0,dz)
> 
> outfile=open('nu.dat','w')
> outfile.write('height, nu, nuh')
> 
> for z,when in enumerate(height):
>   for h in range(10):
>   for N in range(10):
>   for z in range((N-z)+(N-h)):
> 
>   nuh.append(0.01 * exp(-0.05*(z+200.0))*dz) #turbulence
> diffusivity m**2/s
>   nu.append(num + nuh[z])
> 
> ---
> What I like to do with this program is do loop like the fortran
> version of  as follows:
> 
> do i = 2, N
> z(i) = z(i-1) +h(i-1)
> 
> end do
> 
> write(0,*) 'z ', z(1:N)
> write(0,*) 'when ', 'nu ','Conc '
> 
> 
> do i= 1, N
> 
>  nuh(i)= 0.01d0*exp(-0.005d2*(z(i)+200)) ! turbulence diffusivity m**2/s
>  nu(i)= num(1) + nuh(i)
> 
> 
> end do
> 
> --
> My problem is I am notable have the curve in the output plot as I have
> as a result of  FORTRAN program. What happens is just having a
> straight line!
> the whole problem is in z part, which is supposed to be changed and i
> do not see it!
> 
> So, would it be possible to take a look at it please. any suggestion
> would greatly appreciated.
> 
> Thank you,
> Sue
> ___
> Tutor maillist  -  Tutor@python.org
> To unsubscribe or change subscription options:
> http://mail.python.org/mailman/listinfo/tutor
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] how to delete some quasi-duplicated keys

2011-11-25 Thread lina
for key, value in pairs.items():
if key[::-1] in pairs.keys() and pairs[key] != 0:
pairs[key] += pairs[key[::-1]]
pairs[key[::-1]]=0
for k, v in pairs.items():
if v != 0:
print(v,k)

Now very trivial, but works.


On Fri, Nov 25, 2011 at 5:34 PM, lina  wrote:
> #!/usr/bin/python3
>
> dehydrons={}
> pairs={}
> #frozen set way pairs
> fs_pairs={}
> occurence={}
> total=0
> dictionary={}
> candidate_dehydron={}
>
>
> if __name__=="__main__":
>
>    with open("dehydron_refined_data_18.txt","r") as f:
>        for line in f.readlines():
>            parts=line.split()
>            #pair=set((parts[0],parts[1]))
>            if (parts[0],parts[1]) not in dehydrons.keys():
>                dehydrons[(parts[0],parts[1])]=parts[2]
>                occurence[(parts[0],parts[1])]=1
>                #pair=frozenset(('parts[0]','parts[1]'))
>                #pairs[pair]=pairs.get(pair,0)+parts[2]
>            else:
>                occurence[(parts[0],parts[1])]+=1
>            #for k, v in dehydrons.items():
>            #print(k,v)
>
>
>        for k, v in occurence.items():
>            if v>=25:
>                #print(v,k)
>                candidate_dehydron[k]=v
>            #print("{:.2f}".format(v/2768*100),k)
>            total+=v
>        print(total)
>
>        for k, v in candidate_dehydron.items():
>            pairs[k] = v
>
>
>        '''for key in pairs.keys():
>            if key[::-1] in pairs:
>                pairs[key] += pairs[key[::-1]]
>                del pairs[key[::-1]]
>            print(pairs)'''
>
>
>        #for k, v in pairs.items():
>            #print(v,k)
>
>
>
>            I attached the not working code,  Thanks for any advice,
>
>
> best regards,
>
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Do loop in Python

2011-11-25 Thread stm atoc
regarding to the last email:


what  I am trying to do is seeing the variation of 'nu' over (changes of)  'z'.

My concern is how to arrange this!

Basically, I am not able to define the variation of  nu by z ( 1 to
200). I am looking for a statement to show the changes of 'nu' for
each step of z (as height).
On the other hand, for each step, 'h' is supposed to be subtracted
from 'z' (like: 200-10, 190-10...) as well, at least 10 times (which
was trying to be defined as N)!
I hope this is somehow clear

Thanks in advance,
Sue
- Show quoted text -
On Fri, Nov 25, 2011 at 10:16 AM, stm atoc  wrote:
> Hi there,
>
> I am a new python user.
> I have  a question regarding  do loop.
>
> This is a simple program that I have written:
>
> -
> N=10
> h=10.0 # [micrometer]
> z=-200.0 # [micrometer]
> num = 0.05 #m**2/s
> dz = 1.0
> nuh=[]
> tmax=3600
> dt=20.
> nu=[]height = arange(z*dz,0,dz)
>
> outfile=open('nu.dat','w')
> outfile.write('height, nu, nuh')
>
> for z,when in enumerate(height):
>   for h in range(10):
>       for N in range(10):
>           for z in range((N-z)+(N-h)):
>
>               nuh.append(0.01 * exp(-0.05*(z+200.0))*dz) #turbulence
> diffusivity m**2/s
>               nu.append(num + nuh[z])
>
> ---
> What I like to do with this program is do loop like the fortran
> version of  as follows:
>
> do i = 2, N
>  z(i) = z(i-1) +h(i-1)
>
> end do
>
> write(0,*) 'z ', z(1:N)
> write(0,*) 'when ', 'nu ','Conc '
>
>
> do i= 1, N
>
>  nuh(i)= 0.01d0*exp(-0.005d2*(z(i)+200)) ! turbulence diffusivity m**2/s
>  nu(i)= num(1) + nuh(i)
>
>
> end do
>
> --
> My problem is I am notable have the curve in the output plot as I have
> as a result of  FORTRAN program. What happens is just having a
> straight line!
> the whole problem is in z part, which is supposed to be changed and i
> do not see it!
>
>  So, would it be possible to take a look at it please. any suggestion
> would greatly appreciated.
>
> Thank you,
> Sue
>
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] how to delete some quasi-duplicated keys

2011-11-25 Thread Steven D'Aprano

lina wrote:

On Fri, Nov 25, 2011 at 5:06 PM, Steven D'Aprano  wrote:



pair = frozenset(('66', '69'))
pairs[pair] = pairs.get(pair, 0) + value


I don't get this "pairs.get" part.


The "get" method does a look-up on a dict, but instead of failing if the 
key is missing, it returns a default value:


py> d = {'a': 2}
py> d['b']  # fails
Traceback (most recent call last):
  File "", line 1, in 
KeyError: 'b'
py> d.get('b', 3)  # use 3 as the default
3



 pairs[pair]=pairs.get(pair,0)+parts[2]
TypeError: unsupported operand type(s) for +: 'int' and 'str'


Lina, in your original example, the values of the dict are integers:

{('66', '69'): 217, ('69', '66'): 75, ('64', '71'): 25}

The error you show above can only happen if they are not integers, but 
strings. When you show us examples, please get the examples right. If 
you give us wrong information, how do you expect us to help?


You should convert all the strings into ints.



or line in f.readlines():
parts=line.split()
#pair=set((parts[0],parts[1]))
if (parts[0],parts[1]) not in dehydrons.keys():
dehydrons[(parts[0],parts[1])]=parts[2]
occurence[(parts[0],parts[1])]=1
pair=frozenset(('parts[0]','parts[1]'))
pairs[pair]=pairs.get(pair,0)+parts[2]
else:
occurence[(parts[0],parts[1])]+=1



f = open("some file")
dehydrons = {}
occurrence = {}
pairs = {}
for line in f.readlines():
parts = line.split()
# convert to ints
parts = [int(s) for s in parts]
pair = frozenset(parts[:2])  # order doesn't matter
if pair in dehydrons:
occurrence[pair] += 1
else:
dehydrons[pair] = parts[2]
occurrence[pair] = 1
pairs[pair] = pairs.get(pair, 0) + parts[2]
f.close()



--
Steven
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Do loop in Python

2011-11-25 Thread Steven D'Aprano

stm atoc wrote:

Hi there,

I am a new python user.
I have  a question regarding  do loop.

This is a simple program that I have written:

-
N=10
h=10.0 # [micrometer]
z=-200.0 # [micrometer]


You define N, h and z here, but later on you use them as loop variables. 
So these three values never get used: they are thrown away, and replaced 
by the values of the loops:


h -> 0, 1, 2, ... 9
N -> 0, 1, 2, ... 9

z is especially troublesome, because it gets used for TWO loop 
variables, one inside the other. The inner z loop depends on the outer z 
loop, which makes it tricky to predict what values z will take.




num = 0.05 #m**2/s
dz = 1.0
nuh=[]
tmax=3600
dt=20.
nu=[]height = arange(z*dz,0,dz)


What is arange?

In physics, "height" is a scalar. But later on, you seen to use height 
as if it were a collection of values.




outfile=open('nu.dat','w')
outfile.write('height, nu, nuh')

for z,when in enumerate(height):
   for h in range(10):
   for N in range(10):
   for z in range((N-z)+(N-h)):

   nuh.append(0.01 * exp(-0.05*(z+200.0))*dz) #turbulence
diffusivity m**2/s
   nu.append(num + nuh[z])

---
What I like to do with this program is do loop like the fortran
version of  as follows:

do i = 2, N
 z(i) = z(i-1) +h(i-1)

end do



How is z initialised? What is h?


I *think* you are trying to add a small increment to each value, based 
on the previous value. Am I close?



Does this example help?


zvalues = [1]  # starting value
increments = [0.01, 0.01, 0.02, 0.01, 0.01, 0.02, 0.01, 0.01]
for h in increments:
z = zvalues[-1] + h
zvalues.append(z)

print(zvalues)


(Note: beware of floating point rounding.)




--
Steven

___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


[Tutor] Weird Try..Except Error

2011-11-25 Thread Nikunj.Badjatya

Hi All,

Please look at the snippet below.
When I am running my module its giving me following error.
Using : Python 2.7, windows Env.

{{{
# User defined modules
try:
from scripts import precheck
from scripts import input
from scripts import validate
from scripts import logsetup
from scripts.constants import *
except ImportError, err_msg:  ==> line 38
print("ERROR {0}".format(err_msg))
print("INFO  Please verify the presence of above module, and restart the 
installation")
sys.exit(1)

}}}

{{{
Output:

C:\> install.py -f input.xml
  File " C:\>install.py", line 38
except ImportError, err_msg:
  ^
SyntaxError: invalid syntax
}}}

I checked the comma and spacing and didn't find any problem.

Any idea.?

Thanks
Nikunj
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Weird Try..Except Error

2011-11-25 Thread Peter Otten
nikunj.badja...@emc.com wrote:

> Please look at the snippet below.
> When I am running my module its giving me following error.
> Using : Python 2.7, windows Env.
> 
> {{{
> # User defined modules
> try:
> from scripts import precheck
> from scripts import input
> from scripts import validate
> from scripts import logsetup
> from scripts.constants import *
> except ImportError, err_msg:  ==> line 38
> print("ERROR {0}".format(err_msg))
> print("INFO  Please verify the presence of above module, and restart
> the installation") sys.exit(1)
> 
> }}}
> 
> {{{
> Output:
> 
> C:\> install.py -f input.xml
>   File " C:\>install.py", line 38
> except ImportError, err_msg:
>   ^
> SyntaxError: invalid syntax
> }}}
> 
> I checked the comma and spacing and didn't find any problem.
> 
> Any idea.?

You are likely mistaken about the Python version you are using. The above 
error will be triggered by Python 3.x which expects

try:
...
except ImportError as err_msg:
...


___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] how to delete some quasi-duplicated keys

2011-11-25 Thread Alan Gauld

On 25/11/11 08:41, lina wrote:

pairs

{('66', '69'): 217, ('69', '66'): 75, ('64', '71'): 25}


such as here ('66', '69') and ('69', '66') is one key,

I wanna keep only one and add the value of those two keys, above is a
very simple example:

here is the (failed) code:

 for k, v in pairs.items():
 if str(k)[1]+str(k)[0] in pairs.keys():


I don;t think this does what you think it does.

k is a key from pairs which looks like ('66', '69')
You convert that to a string (with str(k)) which
yields : "('66', '69')"

You then add the first two characters of that string.
Those are ( and ' so you get a value of (' and ask whether that appeats 
in pairs.keys() which it will not because the keys are tuples.


So the if block never happens


 print(pairs[str(k)[1]+str(k)[0]])
 pairs[k]+=pairs[str(k)[1]+str(k)[0]]
 del pairs[str(k)[1]+str(k)[0]]




 print(v,k)


And you print the original value followed by the tuple key.

I'm pretty sure thats not what you want.

Maybe you are trying to add the two elements of the tuple?
But even that won't disambiguate between (66,69) and (69,66)
You would need to sort the tuples first so that both would
render 66,69.

HTH,

--
Alan G
Author of the Learn to Program web site
http://www.alan-g.me.uk/

___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] how to delete some quasi-duplicated keys

2011-11-25 Thread lina
On Fri, Nov 25, 2011 at 7:19 PM, Steven D'Aprano  wrote:
> lina wrote:
>>
>> On Fri, Nov 25, 2011 at 5:06 PM, Steven D'Aprano 
>> wrote:
>
>>> pair = frozenset(('66', '69'))
>>> pairs[pair] = pairs.get(pair, 0) + value
>>
>> I don't get this "pairs.get" part.
>
> The "get" method does a look-up on a dict, but instead of failing if the key
> is missing, it returns a default value:
>
> py> d = {'a': 2}
> py> d['b']  # fails
> Traceback (most recent call last):
>  File "", line 1, in 
> KeyError: 'b'
> py> d.get('b', 3)  # use 3 as the default
> 3
>
>
>>  pairs[pair]=pairs.get(pair,0)+parts[2]
>> TypeError: unsupported operand type(s) for +: 'int' and 'str'
>
> Lina, in your original example, the values of the dict are integers:
Ha ... it's me.
>
> {('66', '69'): 217, ('69', '66'): 75, ('64', '71'): 25}
>
> The error you show above can only happen if they are not integers, but
> strings. When you show us examples, please get the examples right. If you
> give us wrong information, how do you expect us to help?
Sorry, I was confused at that time.
>
> You should convert all the strings into ints.
>
>
>> or line in f.readlines():
>>            parts=line.split()
>>            #pair=set((parts[0],parts[1]))
>>            if (parts[0],parts[1]) not in dehydrons.keys():
>>                dehydrons[(parts[0],parts[1])]=parts[2]
>>                occurence[(parts[0],parts[1])]=1
>>                pair=frozenset(('parts[0]','parts[1]'))
>>                pairs[pair]=pairs.get(pair,0)+parts[2]
>>            else:
>>                occurence[(parts[0],parts[1])]+=1
>
>
> f = open("some file")
> dehydrons = {}
> occurrence = {}
> pairs = {}
> for line in f.readlines():
>    parts = line.split()
>    # convert to ints
>    parts = [int(s) for s in parts]
>    pair = frozenset(parts[:2])  # order doesn't matter
>    if pair in dehydrons:
>        occurrence[pair] += 1
>    else:
>        dehydrons[pair] = parts[2]
>        occurrence[pair] = 1
>        pairs[pair] = pairs.get(pair, 0) + parts[2]
> f.close()
>
for line in f.readlines():
parts = line.split()
#pair=set((parts[0],parts[1]))
#convert to ints
parts = [int(s) for s in parts]
pair = frozenset(parts[:2])
print(pair)
if pair in dehydrons:
occurence[pair] += 1
else:
dehydrons[pair] = parts[2]
pairs[pair] = pairs.get(pair,0) + parts[2]
print(pairs)


$ python3 dehydron_data_frozenset_version.py
frozenset({2, 15})
frozenset({2, 15})
Traceback (most recent call last):
  File "dehydron_data_frozenset_version.py", line 35, in 
occurence[pair] += 1
KeyError: frozenset({2, 15})

Thanks,

>
>
> --
> Steven
> ___
> Tutor maillist  -  Tutor@python.org
> To unsubscribe or change subscription options:
> http://mail.python.org/mailman/listinfo/tutor
>
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Weird Try..Except Error

2011-11-25 Thread Nikunj.Badjatya
Hi All,

Thanks for the info.
I had Python27 and Python32 both installed togethar.
In Windows the PATH env variable, I had set Python27 exe and lib path.

But When I do
C:\> Python  [PressEnter]
I get 2.7

But when I run 
C:\> script.py  [PressEnter]
The script is running with Python3.2 , thts weird because I have set my Path 
variable with Pytho27 exe and lib.

Which was causing the problem.

Thanks
Nikunj

-Original Message-
From: tutor-bounces+nikunj.badjatya=emc@python.org 
[mailto:tutor-bounces+nikunj.badjatya=emc@python.org] On Behalf Of Peter 
Otten
Sent: Friday, November 25, 2011 5:28 PM
To: tutor@python.org
Subject: Re: [Tutor] Weird Try..Except Error

nikunj.badja...@emc.com wrote:

> Please look at the snippet below.
> When I am running my module its giving me following error.
> Using : Python 2.7, windows Env.
> 
> {{{
> # User defined modules
> try:
> from scripts import precheck
> from scripts import input
> from scripts import validate
> from scripts import logsetup
> from scripts.constants import *
> except ImportError, err_msg:  ==> line 38
> print("ERROR {0}".format(err_msg))
> print("INFO  Please verify the presence of above module, and restart
> the installation") sys.exit(1)
> 
> }}}
> 
> {{{
> Output:
> 
> C:\> install.py -f input.xml
>   File " C:\>install.py", line 38
> except ImportError, err_msg:
>   ^
> SyntaxError: invalid syntax
> }}}
> 
> I checked the comma and spacing and didn't find any problem.
> 
> Any idea.?

You are likely mistaken about the Python version you are using. The above 
error will be triggered by Python 3.x which expects

try:
...
except ImportError as err_msg:
...


___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


[Tutor] sensing EOF in Python 3.1

2011-11-25 Thread Cranky Frankie
From: Steven D'Aprano  wrote:

<>

Right, thanks.

<>

I want to include this info in my presentation because it shows how
data structures can be externalized.

<>

Still though, that is important.

< Sarcasm aside, what else could "import pickle" mean other than import
> the pickle module?>>

I was trying to put a comment on every line because the audience who
will be looking at this will have never seen any Python before.

<>

I know what you mean. The commens could be meaningful at first, then
the code gets edited over the years and the comments don't get
updated. I've seen that many times.

<>

Again, in this specific instance, this simple example code is intended
to be looked at not by Python programmers, or even programmers, but
rather by database professionals who I am attempting to expose Python
to for the first time.

<>

You are of course, correct, thanks. I'll be fixing that.


Steven thanks for your comments about comments, I'll be doing them
over for sure.


-- 
Frank L. "Cranky Frankie" Palmeri
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Do loop in Python

2011-11-25 Thread stm atoc
Thank you so much for your reply. It was very helpful information and
I used it in order to improve the program

Here is the new version of the program:

zvalues = [-200]  # starting value
hvalues = [10]  # starting value
increments = [1, 1, 1, 1, 1, 1, 1, 1]
for N in increments:
   h = hvalues[-1] - N
   hvalues.append(h)
   z = zvalues[-1] + h
   zvalues.append(z)
   height = arange((z)*dz,0,dz)
   for z,when in enumerate(height):
   nuh.append(0.001 * exp(-0.005*(z+200.0))*dz) #turbulence
diffusivity m**2/s
   nu.append(num + nuh[z])

The story is like this:
I should define layers and thickness and see how the diffusion profile
changes over the z.
height (or depth) of the total thickness or 'z'.
I basically, define 'z' in 10 layers and each layer is called  ' N' .
Difference between each layer is 'h', which is equal 10 micrometer.
Now, what I like to do is the modification of nu based on each zvalue
In fact, for each 'zvalue' o'z' step, I need to calculate a different
value for 'nu' based on the available equation in the program.

BUT, I am not sure, exactly, how to add the new do loop of z inside
another loop of nu.

I have done this way as well (the other way around):

height = arange((z)*dz,0,dz)
for z,when in enumerate(height):
for N in increments:
   h = hvalues[-1] - N
   hvalues.append(h)
   z = zvalues[-1] + h
   zvalues.append(z)
   nuh.append(0.001 * exp(-0.005*(z+200.0))*dz) #turbulence
diffusivity m**2/s
   nu.append(num + nuh[z])

but still no sign of 'nu changes' over 'z'!

So, would it be possible to check that again?

Thanks, Sue

On Fri, Nov 25, 2011 at 12:36 PM, Steven D'Aprano  wrote:
> stm atoc wrote:
>>
>> Hi there,
>>
>> I am a new python user.
>> I have  a question regarding  do loop.
>>
>> This is a simple program that I have written:
>>
>> -
>> N=10
>> h=10.0 # [micrometer]
>> z=-200.0 # [micrometer]
>
> You define N, h and z here, but later on you use them as loop variables. So
> these three values never get used: they are thrown away, and replaced by the
> values of the loops:
>
> h -> 0, 1, 2, ... 9
> N -> 0, 1, 2, ... 9
>
> z is especially troublesome, because it gets used for TWO loop variables,
> one inside the other. The inner z loop depends on the outer z loop, which
> makes it tricky to predict what values z will take.
>
>
>> num = 0.05 #m**2/s
>> dz = 1.0
>> nuh=[]
>> tmax=3600
>> dt=20.
>> nu=[]height = arange(z*dz,0,dz)
>
> What is arange?
>
> In physics, "height" is a scalar. But later on, you seen to use height as if
> it were a collection of values.
>
>
>> outfile=open('nu.dat','w')
>> outfile.write('height, nu, nuh')
>>
>> for z,when in enumerate(height):
>>   for h in range(10):
>>       for N in range(10):
>>           for z in range((N-z)+(N-h)):
>>
>>               nuh.append(0.01 * exp(-0.05*(z+200.0))*dz) #turbulence
>> diffusivity m**2/s
>>               nu.append(num + nuh[z])
>>
>> ---
>> What I like to do with this program is do loop like the fortran
>> version of  as follows:
>>
>> do i = 2, N
>>  z(i) = z(i-1) +h(i-1)
>>
>> end do
>
>
> How is z initialised? What is h?
>
>
> I *think* you are trying to add a small increment to each value, based on
> the previous value. Am I close?
>
>
> Does this example help?
>
>
> zvalues = [1]  # starting value
> increments = [0.01, 0.01, 0.02, 0.01, 0.01, 0.02, 0.01, 0.01]
> for h in increments:
>    z = zvalues[-1] + h
>    zvalues.append(z)
>
> print(zvalues)
>
>
> (Note: beware of floating point rounding.)
>
>
>
>
> --
> Steven
>
> ___
> Tutor maillist  -  Tutor@python.org
> To unsubscribe or change subscription options:
> http://mail.python.org/mailman/listinfo/tutor
>
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Weird Try..Except Error

2011-11-25 Thread Steve Willoughby

On 25-Nov-11 04:42, nikunj.badja...@emc.com wrote:

Hi All,

Thanks for the info.
I had Python27 and Python32 both installed togethar.
In Windows the PATH env variable, I had set Python27 exe and lib path.

But When I do
C:\>  Python  [PressEnter]
I get 2.7

But when I run
C:\>  script.py  [PressEnter]
The script is running with Python3.2 , thts weird because I have set my Path 
variable with Pytho27 exe and lib.

Which was causing the problem.


The problem is likely that when you installed Python 3.2, Windows 
associated the ".py" extension with the new 3.2 interpreter, PATH 
notwithstanding.


steve

--
Steve Willoughby / st...@alchemy.com
"A ship in harbor is safe, but that is not what ships are built for."
PGP Fingerprint 4615 3CCE 0F29 AE6C 8FF4 CA01 73FE 997A 765D 696C
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] how to delete some quasi-duplicated keys

2011-11-25 Thread Andreas Perstinger

On 2011-11-25 13:40, lina wrote:

On Fri, Nov 25, 2011 at 7:19 PM, Steven D'Aprano  wrote:

 f = open("some file")
 dehydrons = {}
 occurrence = {}
 pairs = {}
 for line in f.readlines():
 parts = line.split()
 # convert to ints
 parts = [int(s) for s in parts]
 pair = frozenset(parts[:2])  # order doesn't matter
 if pair in dehydrons:
 occurrence[pair] += 1
 else:
 dehydrons[pair] = parts[2]
 occurrence[pair] = 1
 pairs[pair] = pairs.get(pair, 0) + parts[2]
 f.close()


 for line in f.readlines():
 parts = line.split()
 #pair=set((parts[0],parts[1]))
 #convert to ints
 parts = [int(s) for s in parts]
 pair = frozenset(parts[:2])
 print(pair)
 if pair in dehydrons:
 occurence[pair] += 1
 else:
 dehydrons[pair] = parts[2]
 pairs[pair] = pairs.get(pair,0) + parts[2]
 print(pairs)


$ python3 dehydron_data_frozenset_version.py
frozenset({2, 15})
frozenset({2, 15})
Traceback (most recent call last):
   File "dehydron_data_frozenset_version.py", line 35, in
 occurence[pair] += 1
KeyError: frozenset({2, 15})


You want to add one to "occurence[frozenset({2, 15})]" but there is no 
such key in "occurence" yet.


If you carefully re-read Steven's code snippet you will see that you 
missed the line


occurence[pair] = 1

in the else-branch.

Therefore "occurence[frozenset({2, 15})]" wasn't set in the first 
iteration and you get the error in the second. You can see that you are 
already in the second iteration by looking at the output of your program 
before the error message.


Bye, Andreas
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Shortening the code.

2011-11-25 Thread Mic



>from functools import partial



I use this  kind of explicit import for a few names that I use frequently,
namely defaultdict, contextmanager, everything from itertools...
I think of these as my personal extended set of builtins ;)


As to the actual partial() function, you probably don't see it a lot 
because

it has been in the standard library for only three years. The older idiom
for making a function that calls another function with a fixed argument is


command = lambda button=button: button_clicked(button)

Alright! What is a fixed argument?



You can iterate over (row, column) pairs instead of the dummy _ variable:



def create_widgets(self):

   >for row, column in [(0, 0), (1, 1), (2, 2), (3, 0)]:
   >button = tk.Button(self)
   >command = partial(button_clicked, button)
   >button["command"] = command
   >button.grid(row=row, column=column)
   >command()

Very nice! I didn't know that it was possible. This saves me a lot of space.
Am I, as a beginner, supposed to know this?

Say that when button one is pressed I want a text file to be created. The 
text in the
file should be the same number as the button I pressed. So if I press button 
one, once,
it should create a text file with the name button_1. The text in the file 
should also be "button_1".


If the button is pressed again, it should remove the file. Is this possible 
to do without

any trouble?

So if the second button is pressed , it should create a text file with the 
name button_2
and the text in it should be button_2. If the button is pressed once again, 
it is supposed to

delete that file it created.




I don't know if it works with this piece of code you posted earlier:


def create_widgets(self):

   >for row, column in [(0, 0), (1, 1), (2, 2), (3, 0)]:
   >button = tk.Button(self)
   >command = partial(button_clicked, button)
   >button["command"] = command
   >button.grid(row=row,



Otherwise it might work with the code below this comment?


def button_clicked(button):
   if button["bg"] == "green":
   button.configure(bg="red", text="Hi 2")
   else:
   button.configure(bg="green", text="Hi 1")

class Window(tk.Frame):
   def __init__(self, master):
   super (Window, self).__init__(master)
   self.grid()
   self.create_widgets()

   def create_widgets(self):
   for _ in range(2):
   button = tk.Button(self)
   command = partial(button_clicked, button)
   button["command"] = command
   button.grid()
   command()





I also have one last question.
How do I make the first button that is created to be named
1, the second to be created 2, the third 3 and so on?







Also, assume that I have a already have a window with a button in it. If
you press this button, this window is supposed to open.
So, if I press the button, will this window open? Because I created the
previous window using
from tkinter import* and not import tkinter as tk.



You can make the decision what style you want to use on a per-module basis.
In that module you can then access (for example) a tkinter button with
either tkinter.Button, tk.Button or just Button.
You can even mix styles if you put the respective imports at the beginning
of the module (not recommended).
What approach you take has no consequences on the execution of the program.



I didn't know that, thanks. It is strange that this wasn't mentioned in my 
book.
Why is it not recommended to to mix the styles if you put the respective 
imports at the

beginning of the module?


Thanks again for your help and insightful suggestions.
It is really appreciated :)

Mic


___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Shortening the code.

2011-11-25 Thread Peter Otten
Mic wrote:

> 
>> >from functools import partial
> 
>>I use this  kind of explicit import for a few names that I use frequently,
>>namely defaultdict, contextmanager, everything from itertools...
>>I think of these as my personal extended set of builtins ;)
> 
>>As to the actual partial() function, you probably don't see it a lot
>>because
>>it has been in the standard library for only three years. The older idiom
>>for making a function that calls another function with a fixed argument is
> 
> command = lambda button=button: button_clicked(button)
> 
> Alright! What is a fixed argument?

Suppose you have a function add() that calculates the sum of two values

>>> def add(a, b):
... return a + b
...
>>> add(1, 2)
3

If you want another function that takes one argument and adds 2 to that 
argument you can either start from scratch

>>> def plus_two(b):
... return 2 + b
...
>>> plus_two(7)
9

or build on your earlier work

>>> from functools import partial
>>> plus_two = partial(add, 2)
>>> plus_two(3)
5

The effect of wrapping add into partial here is that every time you call 
plus_two(x) it will in turn call add(2, x). As the first argument is always 
the same I called it "fixed", but it's not a terminus technicus.

>>You can iterate over (row, column) pairs instead of the dummy _ variable:
> 
>>def create_widgets(self):
> >for row, column in [(0, 0), (1, 1), (2, 2), (3, 0)]:
> >button = tk.Button(self)
> >command = partial(button_clicked, button)
> >button["command"] = command
> >button.grid(row=row, column=column)
> >command()
> 
> Very nice! I didn't know that it was possible. This saves me a lot of
> space. Am I, as a beginner, supposed to know this?

You may read it up somewhere or be shown on a mailinglist ;)

> Say that when button one is pressed I want a text file to be created. The
> text in the
> file should be the same number as the button I pressed. So if I press
> button one, once,
> it should create a text file with the name button_1. The text in the file
> should also be "button_1".
> 
> If the button is pressed again, it should remove the file. Is this
> possible to do without
> any trouble?
> 
> So if the second button is pressed , it should create a text file with the
> name button_2
> and the text in it should be button_2. If the button is pressed once
> again, it is supposed to
> delete that file it created.

> I also have one last question.
> How do I make the first button that is created to be named
> 1, the second to be created 2, the third 3 and so on?

Here's a modified script:

import tkinter as tk
from functools import partial

def button_clicked(button):
if button["bg"] == "green":
button["bg"] = "red"
print("deleting file", button.filename)
else:
button["bg"] = "green"
print("creating file", button.filename)

class Window(tk.Frame):
def __init__(self, master):
super (Window, self).__init__(master)
self.grid()
self.create_widgets()

def create_widgets(self):
for index in range(20):
button = tk.Button(self, text="Button {}".format(index+1), 
bg="red")
button.filename = "button{}.txt".format(index+1)
command = partial(button_clicked, button)
button["command"] = command
row, column = divmod(index, 4)
button.grid(row=row, column=column)

root = tk.Tk()
root.title("Test")
app = Window(root)
root.mainloop()

I hope you can infer answers to your questions from the above...

To be honest, we've reached the point where I would switch to a 
tkinter.Button subclass:

import tkinter as tk

FREE = "green"
OCCUPIED = "red"

class SeatButton(tk.Button):
def __init__(self, master, index):
text = "Button {}".format(index+1)
super(SeatButton, self).__init__(master, text=text, bg=FREE, 
command=self.clicked)
self.filename = "button{}.txt".format(index+1)
self.occupied = False

def clicked(self):
self.occupied = not self.occupied
if self.occupied:
self["bg"] = OCCUPIED
print("creating file", self.filename)
else:
self["bg"] = FREE
print("deleting file", self.filename)

class Window(tk.Frame):
def __init__(self, master):
super (Window, self).__init__(master)
self.grid()
self.create_widgets()

def create_widgets(self):
for index in range(20):
button = SeatButton(self, index)
row, column = divmod(index, 4)
button.grid(row=row, column=column)

root = tk.Tk()
root.title("Test")
app = Window(root)
root.mainloop()

Too bad that now you've understood what partial() does it's gone...

> Why is it not recommended to to mix the styles if you put the respective
> imports at the
> beginning of the module?

Consistency. Either call the button tk.Button or Button.

___
Tutor maillist  -

Re: [Tutor] Weird Try..Except Error

2011-11-25 Thread Alan Gauld

On 25/11/11 12:42, nikunj.badja...@emc.com wrote:


I had Python27 and Python32 both installed togethar.
In Windows the PATH env variable, I had set Python27 exe and lib path.

But When I do
C:\>  Python  [PressEnter]
I get 2.7

But when I run
C:\>  script.py  [PressEnter]
The script is running with Python3.2 ,

> thts weird because I have set my Path variable with Pytho27 exe

This is one of the annoying ambiguities of Windows.
The way it finds the executable for  executables(exe, bat cmd etc) is 
different to how it finds the executable for associations.


In the former case it uses PATH, in the latter it relies on the file 
association set in the file properties.


When you install a new Python it  tends to set itself as
the default interpreter for .py files.

Annoying,

Alan G.

___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Shortening the code of a finsihed program.

2011-11-25 Thread Mic



Its usually better to paste long programs into a pastebin web site and
give us a link.
This saves cluttering up people mail with long messages, and also the
pastebin rendering will usually be easier to read with syntax coloring etc.


Alright. Sorry if I should know this, but what is a pastebin web site and 
how do

I paste my program into a pastebin web site?






While its perfectly legal Python to create a class inside a method its
very unusual in practice and very restricting in the use of the class.
Its nearly always better to declare all your classes at the top level of
the program.



Why is it restricting?



Because you post lost all the formatting, I'm not sure where this code
is supposed to sit... This is again where a pastebin would help.


Oh, now I understand why I shouldn't post like this. My apologize, won't 
happen again.




And this is repeating all the bad habits from your original posts. If
you adopt the ChairButton class approach all of this becomes much
clearer and simpler.


I got a really good tip earlier on in the thread how I could make my program
dramatically shorter. I have tried to implement a couple of things I need
into that piece of code, but I cannot get it to work.

So I figured I could post it here (short code) and ask you a couple of 
questions

regarding the code:


import tkinter as tk
from functools import partial

def button_clicked(button):
   if button["bg"] == "green":
   button.configure(bg="red", text="01")

   else:
   button.configure(bg="green", text="01")



class Window(tk.Frame):
   def __init__(self, master):
   super (Window, self).__init__(master)
   self.grid()
   self.create_widgets()


   def create_widgets(self):
   list_chair=[(0, 0), (0, 1), (0, 3), (0, 4), (1,0)]
   for row, column in list_chair:
   button = tk.Button(self)
   command = partial(button_clicked, button)
   button["command"] = command
   button.grid(row=row, column=column)
   command()


root = tk.Tk()
root.title("Test")
root.geometry("200x200")
app = Window(root)
root.mainloop()


Questions:

--I want the first button to be created to have the text "1". The second 
should have the text "2".

 The third the text "3" and so on.

--When the first button is pressed I want a file to be created with the name 
Germany_France_1.

  The text in the file should be Germany_France_1.
  If/When the button is pressed again it should delete the file.

 When the second button is pressed I want a file to be created with the 
name Germany_France_2.

  The text in the file should be Germany_France_2.
  If/When the button is pressed again it should delete the file.

 When the third button is pressed I want a file to be created with the name 
Germany_France_3.

  The text in the file should be Germany_France_3.
  If/When the button is pressed again it should delete the file.



Do you have any idea on how I can accomplish this? I reached the conclusion 
that it should be
easy to do so since it was so easy to create so many buttons in so little 
amount of code.


However, to my dismay, I have tried this entire evening without success. It 
feels like I am so close
to shorten my program from 2k+ lines of code to maybe 250 at most, but still 
so far away.












You should only ever have one Tk() object in a Tkinter program.


Why is that?



And again you should only have one mainloop running, otherwise things
would get very confusing with events winding up in the wrong windows
event queue etc.


Alright, my teacher never mentioned that when he examined my program.
Thanks for your input! Your help is as always appreciated and my apologize
for making confusing posts!

Mic 


___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Shortening the code.

2011-11-25 Thread Alan Gauld

On 25/11/11 17:11, Mic wrote:


for making a function that calls another function with a fixed
argument is


command = lambda button=button: button_clicked(button)

Alright! What is a fixed argument?



Its onre that is the same every time the function is called.

The lambda  construct above is equivalent to the following which may 
make it clearer:


def button_clicked(aButton):
 # do something with aButton here
 # that  uses a lot of code and
 # we want to reuse for any button

Now we want to use that function as an event handler, but the function 
passed as the command in tkinter is not allowed to take an argument.


So we create a very short function that takes no arguments but calls 
button_clicked with a fixed argument. And we do this for two buttons

so that they can both use the button_clicked

def button1_clicked():
button_clicked(buttonOne)

def button2_clicked():
button_clicked(buttonTwo)

and we can use these whehn creating our buttons:

buttonOne = Button(parent, command=button1_clicked, )
buttonTwo = Button(parent, command=button2_clicked, )

Now a shorter way of doing that, which avoids writing lots of these very 
small functions is to use lambda, which is an operator that returns a 
function as a value.


Thus

def add2(x): return x+2

can be written

add2 = lambda x: x+2

And if we don't really care about the name - which is
true for the button commands we can put lambda directly
into the widget creation:

buttonOne = Button(parent,
   command=lambda b=buttonOne: button_clicked(b), )

buttonTwo = Button(parent,
   command=lambda b=buttonTwo: button_clicked(b), )

Note that this works because the lambda defines a default argument for 
the command. Thus Tkinter can call the function with no arguments and 
Python will insert the default value at runtime.


HTH,

Alan G.


___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Do loop in Python

2011-11-25 Thread Andreas Perstinger

On 2011-11-25 14:46, stm atoc wrote:

Here is the new version of the program:

zvalues = [-200]  # starting value
hvalues = [10]  # starting value
increments = [1, 1, 1, 1, 1, 1, 1, 1]
for N in increments:
h = hvalues[-1] - N
hvalues.append(h)
z = zvalues[-1] + h
zvalues.append(z)
height = arange((z)*dz,0,dz)


There is no "arange" in python. Could it be that you use numpy and 
import it with "from numpy import *"?



for z,when in enumerate(height):


I'm pretty sure this line doesn't do what you expect it to do. You have 
a sequence (a numpy array) named "height" and after calling "enumerate" 
you get a list of tuples in the form of [(0, height[0]), (1, height[1]), 
...]. Now the for-loop iterates over this list and assigns "z" to the 
first value of the tuple (the index-values) and "when" to the second 
(the values from "height"). You later never use "when" but just use "z". 
If you really want that, the "enumerate" is completly unnecessary and 
you could just use "for z in range(len(height))". But I'm not sure if 
numpy arrays work with "len()".



nuh.append(0.001 * exp(-0.005*(z+200.0))*dz) #turbulence
diffusivity m**2/s
nu.append(num + nuh[z])

The story is like this:
I should define layers and thickness and see how the diffusion profile
changes over the z.
height (or depth) of the total thickness or 'z'.
I basically, define 'z' in 10 layers and each layer is called  ' N' .
Difference between each layer is 'h', which is equal 10 micrometer.
Now, what I like to do is the modification of nu based on each zvalue
In fact, for each 'zvalue' o'z' step, I need to calculate a different
value for 'nu' based on the available equation in the program.

BUT, I am not sure, exactly, how to add the new do loop of z inside
another loop of nu.


For me your explanations are still too confusing. Could it be that you 
are thinking way too complicated?


My guess is you want to have a range of material thicknesses (from 1 to 
200 micrometers in 10 micrometer-steps) and then you want from each 
thickness 10 different layers, right?


import math # you should always tell us which modules you import
num = 0.05 # some constant
nu = [] # list of resulting values
h = 10.0 # height of one layer
thickness = range(0, 210, 10) # a list from 0 to 200 with step 10 (0, 
10, 20, ..., 190, 200)

layers = range(1,11) # a list from 1 to 10
for t in thickness:
  for l in layers:
z = t + h * l # I'm not sure if you want to add or subtract the 
layer thickness

nu = num + (0.01 * math.exp(-0.05 * (z + 200.0)))

This will result in a big one-dimensional list where you calculate for 
each thickness the nu-value for 10 layers. Am I close?
I'm still not sure about the steps and the height of the layers. I also 
wonder if it wouldn't be better to use a two-dimensional list.



I have done this way as well (the other way around):

height = arange((z)*dz,0,dz)
for z,when in enumerate(height):
 for N in increments:
h = hvalues[-1] - N
hvalues.append(h)
z = zvalues[-1] + h
zvalues.append(z)
nuh.append(0.001 * exp(-0.005*(z+200.0))*dz) #turbulence
diffusivity m**2/s
nu.append(num + nuh[z])

but still no sign of 'nu changes' over 'z'!


As Charles has already mentioned, the values for "nu" are very similar 
(they start beginning to differ just at the seventh digit after the 
comma). How do you further process this values? If you plot them what's 
your scale?


Bye, Andreas
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Shortening the code of a finsihed program.

2011-11-25 Thread Alan Gauld

On 25/11/11 21:14, Mic wrote:


Alright. Sorry if I should know this, but what is a pastebin web site
and how do I paste my program into a pastebin web site?


A web site that you can paste stuff and then provide a link(url) that 
others can use to view it.


You can usually specify the code style and it will apply syntax coloring 
for you.


Try a google search for free pastebin...

As an example I've pasted your code from this message at:

http://pastebin.com/H3VzaapV

Take a look and you will see what I mean.


While its perfectly legal Python to create a class inside a method its
very unusual in practice and very restricting in the use of the class.


Why is it restricting?


Because the class is only available inside the function. You cannot 
create objects of that class anywhere outside the class.



So I figured I could post it here (short code) and ask you a couple of
questions regarding the code:


import tkinter as tk
from functools import partial

def button_clicked(button):
   if button["bg"] == "green":
   button.configure(bg="red", text="01")
   else:
   button.configure(bg="green", text="01")


Note you are setting text to '01' in every case. Thats probably not what 
you want?



def create_widgets(self):
list_chair=[(0, 0), (0, 1), (0, 3), (0, 4), (1,0)]
for row, column in list_chair:
   button = tk.Button(self)
   command = partial(button_clicked, button)
   button["command"] = command
   button.grid(row=row, column=column)
   command()


As stated above this will result in every chair being green
and having the text '01' It would be better to put the initial colour 
and text in your data list and configure each button directly:


def create_widgets(self):
 list_chair=[(0, 0, '01'), (0, 1, '02'),
 (0, 3, '03'), (0, 4, '04'),
 (1, 0, '05')]
 for row, column, name in list_chair:
command = partial(button_clicked, button)
button = tk.Button(self, color='green',
   command=command, text=name)
button.grid(row=row, column=column)

Incidentally, This is what I mentioned early on in the
discussion about using a data table to create your widgets.


root = tk.Tk()
root.title("Test")
root.geometry("200x200")
app = Window(root)
root.mainloop()




--When the first button is pressed I want a file to be created with the
name Germany_France_1.
The text in the file should be Germany_France_1.
If/When the button is pressed again it should delete the file.


Lets get the initial UI set up correctly first.
Once we have done that we can worry about adding the functionality.

This is one of the good habits in programming. Do it step by step. Get 
one thing working first before trying to add more features. Its a lot 
easier to debug code when you know what you changed to stop it working.




Do you have any idea on how I can accomplish this? I reached the
conclusion that it should be easy to do so since it was so easy

> to create so many buttons in so little amount of code.

Yes, but lets get the UI all done first, then we can add the button 
features.



You should only ever have one Tk() object in a Tkinter program.


Why is that?


Because thats how Tkinter expects to work! It builds a tree of all the 
windows and widgets in your program. If you have two trees in the same 
program it can get very confused about which widget is doing what to 
which other widgets, especially if they wind up in different trees!.


--
Alan G
Author of the Learn to Program web site
http://www.alan-g.me.uk/

___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Shortening the code of a finsihed program.

2011-11-25 Thread Steven D'Aprano

Alan Gauld wrote:

On 24/11/11 16:20, Mic wrote:


and then try to put these parts togheter into a large program, I decided
to post my entire program.


Its usually better to paste long programs into a pastebin web site and 
give us a link.
This saves cluttering up people mail with long messages, and also the 
pastebin rendering will usually be easier to read with syntax coloring etc.



I'd just like to say that some of us disagree with this advice. Some 
people (e.g. me) often read their where getting access to a browser is 
less convenient. More importantly, many pastebin sites are short-term 
only, after some weeks the bin disappears and the code is lost, which 
destroys the archival value of the post.


If your code snippet is short, say, less than two dozen lines, there's 
no need to using a pastebin, just include it in your post in-line. More 
than that, you should attach it to the post as an attachment, as a .txt 
or .py file. Under no circumstances use your mail client's "rich text", 
colours or multiple fonts.


Even a 200 line program isn't that big, it's only about 6K. If your code 
is so large that syntax highlighting becomes particularly useful, then 
chances are it's too long and people won't read it regardless. We're 
volunteers doing free support, but there are limits to how much code 
we're going to wade through if it doesn't interest us personally.





--
Steven
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Shortening the code of a finsihed program.

2011-11-25 Thread Steven D'Aprano

Hello Mic,

Mic wrote:



Its usually better to paste long programs into a pastebin web site and
give us a link.
This saves cluttering up people mail with long messages, and also the
pastebin rendering will usually be easier to read with syntax coloring 
etc.


Please keep a attribution line when quoting people directly. Even 
something simple like "Fred wrote" will do.



Alright. Sorry if I should know this, but what is a pastebin web site 
and how do

I paste my program into a pastebin web site?


Here's one: http://pastebin.com/

But as I've just written in another post, please don't use it :)



While its perfectly legal Python to create a class inside a method its
very unusual in practice and very restricting in the use of the class.
Its nearly always better to declare all your classes at the top level of
the program.


Why is it restricting?



Because generally speaking, if you define a class inside a function (or 
method), you can't use it *except* inside that function or method.


class K:
def method(self, x):
class Q:
pass

instance = Q()


This doesn't work because Q is not visible from the outside of K.method. 
Sometimes this is what you want; generally it is not.



I don't know much about tkinter, so I will avoid commenting about your code.



--
Steven
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Shortening the code of a finsihed program.

2011-11-25 Thread Alan Gauld

On 26/11/11 00:07, Steven D'Aprano wrote:


Its usually better to paste long programs into a pastebin web site and
give us a link.


I'd just like to say that some of us disagree with this advice. Some
people (e.g. me) often read their where getting access to a browser is
less convenient.


Its true there are downsides to every option.


Even a 200 line program isn't that big, it's only about 6K.


That adds up if you are reading on a  3G smartphone with a 100M data 
limit or paying by the byte. And attachments don't help there.

Plus many email gateways block all attachments as a security measure.


is so large that syntax highlighting becomes particularly useful, then
chances are it's too long and people won't read it regardless.


I find syntax highlighting useful even in very short snippets of code, 
but I agree it's better to just keep the code sample short and post it 
inline.


And I do take the point that pastebins are short lived and so unless the 
replies incorporate the defective code snippets its lost to the archive.


Nonetheless I personally prefer a pastebin posting to a long mail 
listing with no highlighting and often defective indenting. as I say 
there is no perfect solution to long posts other than to shorten them



--
Alan G
Author of the Learn to Program web site
http://www.alan-g.me.uk/

___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] how to delete some quasi-duplicated keys

2011-11-25 Thread lina
On Sat, Nov 26, 2011 at 12:49 AM, Andreas Perstinger
 wrote:
> On 2011-11-25 13:40, lina wrote:
>>
>> On Fri, Nov 25, 2011 at 7:19 PM, Steven D'Aprano
>>  wrote:
>>>
>>>  f = open("some file")
>>>  dehydrons = {}
>>>  occurrence = {}
>>>  pairs = {}
>>>  for line in f.readlines():
>>>     parts = line.split()
>>>     # convert to ints
>>>     parts = [int(s) for s in parts]
>>>     pair = frozenset(parts[:2])  # order doesn't matter
>>>     if pair in dehydrons:
>>>         occurrence[pair] += 1
>>>     else:
>>>         dehydrons[pair] = parts[2]
>>>         occurrence[pair] = 1
>>>         pairs[pair] = pairs.get(pair, 0) + parts[2]
>>>  f.close()
>>>
>>         for line in f.readlines():
>>             parts = line.split()
>>             #pair=set((parts[0],parts[1]))
>>             #convert to ints
>>             parts = [int(s) for s in parts]
>>             pair = frozenset(parts[:2])
>>             print(pair)
>>             if pair in dehydrons:
>>                 occurence[pair] += 1
>>             else:
>>                 dehydrons[pair] = parts[2]
>>                 pairs[pair] = pairs.get(pair,0) + parts[2]
>>         print(pairs)
>>
>>
>> $ python3 dehydron_data_frozenset_version.py
>> frozenset({2, 15})
>> frozenset({2, 15})
>> Traceback (most recent call last):
>>   File "dehydron_data_frozenset_version.py", line 35, in
>>     occurence[pair] += 1
>> KeyError: frozenset({2, 15})
>
> You want to add one to "occurence[frozenset({2, 15})]" but there is no such
> key in "occurence" yet.
>
> If you carefully re-read Steven's code snippet you will see that you missed
> the line
>
> occurence[pair] = 1
>
> in the else-branch.
Thanks, I was so careless.

for k, v in occurence.items():
print(v,k)

292 frozenset({66, 69})
222 frozenset({24, 27})


How can I let the result like:

292 {66,69}
222 {24,27}

don't output the frozenset

>
> Therefore "occurence[frozenset({2, 15})]" wasn't set in the first iteration
> and you get the error in the second. You can see that you are already in the
> second iteration by looking at the output of your program before the error
> message.
>
> Bye, Andreas
> ___
> Tutor maillist  -  Tutor@python.org
> To unsubscribe or change subscription options:
> http://mail.python.org/mailman/listinfo/tutor
>
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


[Tutor] Operation Speed Question

2011-11-25 Thread Charles Karl Becker
Dear Pythonistas,

http://wiki.python.org/moin/PythonSpeed#Takeadvantageofinterpreteroptimizations%E2%80%8C%E2%80%8Bthis
is a link I found concerning optimizing the speed of python code.  Is
anyone familiar with an article or wiki such as this that may cover the
changes that took place in Py3K?  And I've heard that the Standard Library
will discuss the Big O notation for methods etc.  Where do I find the
comments on this in the docs?  A search for O(1) and O(n) returned nothing
on python.org, is http://docs.python.org/py3k/library/timeit.html the best
bet or is there somewhere else to look?
I realize that my code isn't probably going to enter any area where this is
important any time soon, but I'm trying to fill in my gaps in CS theory
without doing so through school.
Thanks!
Charles
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor