/timm's /charming /python /tricks
Download
a12.py.
Read more on How to be Charming (in Python).
01: import random
02: from base import *
03: from lib import *
04:
05: def a12old(lst1,lst2,rev=True):
06: "how often is x in lst1 more than y in lst2?"
07: more = same = 0.0
08: for x in lst1:
09: for y in lst2:
10: if x==y : same += 1
11: elif rev and x > y : more += 1
12: elif not rev and x < y : more += 1
13: return (more + 0.5*same) / (len(lst1)*len(lst2))
14:
15: def a12cmp(x,y):
16: if y - x > 0 : return 1
17: if y - x < 0 : return -1
18: else: return 0
19:
20: def a12(lst1,lst2, gt= a12cmp):
21: "how often is x in lst1 more than y in lst2?"
22: def loop(t,t1,t2):
23: while t1.i < t1.n and t2.i < t2.n:
24: h1 = t1.l[t1.i]
25: h2 = t2.l[t2.i]
26: h3 = t2.l[t2.i+1] if t2.i+1 < t2.n else None
27: if gt(h1,h2) < 0:
28: t1.i += 1; t1.gt += t2.n - t2.i
29: elif h1 == h2:
30: if h3 and gt(h1,h3) < 0:
31: t1.gt += t2.n - t2.i - 1
32: t1.i += 1; t1.eq += 1; t2.eq += 1
33: else:
34: t2,t1 = t1,t2
35: return t.gt*1.0, t.eq*1.0
36: #--------------------------
37: lst1 = sorted(lst1, cmp=gt)
38: lst2 = sorted(lst2, cmp=gt)
39: n1 = len(lst1)
40: n2 = len(lst2)
41: t1 = Thing(l=lst1,i=0,eq=0,gt=0,n=n1)
42: t2 = Thing(l=lst2,i=0,eq=0,gt=0,n=n2)
43: gt,eq= loop(t1, t1, t2)
44: #print gt,eq,n1,n2
45: return gt/(n1*n2) + eq/2/(n1*n2)
46:
47: def a12large(lst1, lst2): return a12(lst1,lst2) > 0.71
48: def a12medium(lst1,lst2): return a12(lst1,lst2) > 0.64
49: def a12small(lst1, lst2): return a12(lst1,lst2) <= 0.56
50:
51: def _ab0():
52: x = a12([4,5,6,7],[7,9,3])
53: print ':expect',0.,375,':got',x
54:
55: def _ab1():
56: x = a12([20, # 5
57: 19, # 5
58: 18, # 4 1
59: 17, # 3 1
60: 16], # 2 1
61: [18,17,16,15,14])
62: print ':expect',0.82,':got',x
63:
64: def _ab2():
65: random.seed(1)
66: l1 = [random.random() for x in range(1000)]
67: l2 = [random.random() for x in range(1000)]
68: t1 = msecs(lambda : a12(l1,l2))
69: t2 = msecs(lambda : a12old(l1,l2))
70: print ':new',t1,':old',t2
71:
72: if __name__ == '__main__' :
73: eval(cmd('_ab0()'))
74:
This file is part of Timm's charming Python tricks.
© 2014, Tim Menzies:
tim.menzies@gmail.com,
http://menzies.us.
Timm's charming Python tricks are free software: you can redistribute it and/or modify it under the terms of the GNU Lesser Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
Timm's charming Python tricks are distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU Lesser Public License along with Foobar. If not, see http://www.gnu.org/licenses.