3408
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
1 |
# Copyright (c) 2007 RADLogic
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
2 |
#
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
3 |
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
4 |
# of this software and associated documentation files (the "Software"), to deal
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
5 |
# in the Software without restriction, including without limitation the rights
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
6 |
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
7 |
# copies of the Software, and to permit persons to whom the Software is
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
8 |
# furnished to do so, subject to the following conditions:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
9 |
#
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
10 |
# The above copyright notice and this permission notice shall be included in
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
11 |
# all copies or substantial portions of the Software.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
12 |
#
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
13 |
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
14 |
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
15 |
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
16 |
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
17 |
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
18 |
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
19 |
# THE SOFTWARE.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
20 |
"""Provide various handy Python functions.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
21 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
22 |
Running this script directly will execute the doctests.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
23 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
24 |
Functions:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
25 |
int2bin(i, n) -- Convert integer to binary string.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
26 |
bin2int(bin_string) -- Convert binary string to integer.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
27 |
reverse(input_string) -- Reverse a string.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
28 |
transpose(matrix) -- Transpose a list of lists.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
29 |
polygon_area(points_list) -- Calculate the area of an arbitrary polygon.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
30 |
timestamp() -- Return string containing current time stamp.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
31 |
pt2str(point) -- Return prettier string version of point tuple.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
32 |
gcf(a, b) -- Return the greatest common factor of two numbers.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
33 |
lcm(a, b) -- Return the least common multiple of two numbers.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
34 |
permutations(input_list) -- Generate all permutations of a list of items.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
35 |
reduce_fraction(fraction) -- Reduce fraction (num, denom) to simplest form.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
36 |
quantile(l, p) -- Return p quantile of list l. E.g. p=0.25 for q1.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
37 |
trim(l) -- Discard values in list more than 1.5*IQR outside IQR.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
38 |
nice_units(value) -- Return value converted to human readable units.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
39 |
uniquify(seq) -- Return sequence with duplicate items in sequence seq removed.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
40 |
reverse_dict(d) -- Return the dictionary with the items as keys and vice-versa.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
41 |
lsb(x, n) -- Return the n least significant bits of x.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
42 |
gray_encode(i) -- Gray encode the given integer.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
43 |
random_vec(bits, max_value=None) -- Return a random binary vector.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
44 |
binary_range(bits) -- Return list of all possible binary numbers width=bits.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
45 |
float_range([start], stop, [step]) -- Return range of floats.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
46 |
find_common_fixes(s1, s2) -- Find common (prefix, suffix) of two strings.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
47 |
is_rotated(seq1, seq2) -- Return true if the list is a rotation of other list.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
48 |
getmodule(obj) -- Return the module that contains the object definition of obj.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
49 |
(use inspect.getmodule instead, though)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
50 |
get_args(argv) -- Store command-line args in a dictionary.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
51 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
52 |
This module requires Python >= 2.2
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
53 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
54 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
55 |
__author__ = 'Tim Wegener <twegener@radlogic.com.au>'
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
56 |
__date__ = '$Date: 2007/03/27 03:15:06 $'
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
57 |
__version__ = '$Revision: 0.45 $'
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
58 |
__credits__ = """
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
59 |
David Chandler, for polygon area algorithm.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
60 |
(http://www.davidchandler.com/AreaOfAGeneralPolygon.pdf)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
61 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
62 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
63 |
import re
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
64 |
import sys
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
65 |
import time
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
66 |
import random
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
67 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
68 |
try:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
69 |
True, False
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
70 |
except NameError:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
71 |
True, False = (1==1, 0==1)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
72 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
73 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
74 |
def int2bin(i, n):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
75 |
"""Convert decimal integer i to n-bit binary number (string).
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
76 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
77 |
>>> int2bin(0, 8)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
78 |
'00000000'
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
79 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
80 |
>>> int2bin(123, 8)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
81 |
'01111011'
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
82 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
83 |
>>> int2bin(123L, 8)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
84 |
'01111011'
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
85 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
86 |
>>> int2bin(15, 2)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
87 |
Traceback (most recent call last):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
88 |
ValueError: Value too large for given number of bits.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
89 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
90 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
91 |
hex2bin = {'0': '0000', '1': '0001', '2': '0010', '3': '0011',
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
92 |
'4': '0100', '5': '0101', '6': '0110', '7': '0111',
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
93 |
'8': '1000', '9': '1001', 'a': '1010', 'b': '1011',
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
94 |
'c': '1100', 'd': '1101', 'e': '1110', 'f': '1111'}
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
95 |
# Convert to hex then map each hex digit to binary equivalent.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
96 |
result = ''.join([hex2bin[x] for x in hex(i).lower().replace('l','')[2:]])
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
97 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
98 |
# Shrink result to appropriate length.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
99 |
# Raise an error if the value is changed by the truncation.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
100 |
if '1' in result[:-n]:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
101 |
raise ValueError("Value too large for given number of bits.")
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
102 |
result = result[-n:]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
103 |
# Zero-pad if length longer than mapped result.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
104 |
result = '0'*(n-len(result)) + result
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
105 |
return result
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
106 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
107 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
108 |
def bin2int(bin_string):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
109 |
"""Convert binary number string to decimal integer.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
110 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
111 |
Note: Python > v2 has int(bin_string, 2)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
112 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
113 |
>>> bin2int('1111')
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
114 |
15
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
115 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
116 |
>>> bin2int('0101')
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
117 |
5
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
118 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
119 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
120 |
## result = 0
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
121 |
## bin_list = list(bin_string)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
122 |
## if len(filter(lambda x: x in ('1','0'), bin_list)) < len(bin_list):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
123 |
## raise Exception ("bin2int: Error - not a binary number: %s"
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
124 |
## % bin_string)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
125 |
## bit_list = map(int, bin_list)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
126 |
## bit_list.reverse() # Make most significant bit have highest index.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
127 |
## for bit_place in range(len(bit_list)):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
128 |
## result = result + ((2**bit_place) * bit_list[bit_place])
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
129 |
## return result
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
130 |
return int(bin_string, 2)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
131 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
132 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
133 |
def reverse(input_string):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
134 |
"""Reverse a string. Useful for strings of binary numbers.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
135 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
136 |
>>> reverse('abc')
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
137 |
'cba'
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
138 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
139 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
140 |
str_list = list(input_string)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
141 |
str_list.reverse()
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
142 |
return ''.join(str_list)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
143 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
144 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
145 |
def transpose(matrix):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
146 |
"""Transpose a list of lists.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
147 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
148 |
>>> transpose([['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']])
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
149 |
[['a', 'd', 'g'], ['b', 'e', 'h'], ['c', 'f', 'i']]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
150 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
151 |
>>> transpose([['a', 'b', 'c'], ['d', 'e', 'f']])
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
152 |
[['a', 'd'], ['b', 'e'], ['c', 'f']]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
153 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
154 |
>>> transpose([['a', 'b'], ['d', 'e'], ['g', 'h']])
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
155 |
[['a', 'd', 'g'], ['b', 'e', 'h']]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
156 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
157 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
158 |
result = zip(*matrix)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
159 |
# Convert list of tuples to list of lists.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
160 |
# map is faster than a list comprehension since it is being used with
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
161 |
# a built-in function as an argument.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
162 |
result = map(list, result)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
163 |
return result
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
164 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
165 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
166 |
def polygon_area(points_list, precision=100):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
167 |
"""Calculate area of an arbitrary polygon using an algorithm from the web.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
168 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
169 |
Return the area of the polygon as a positive float.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
170 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
171 |
Arguments:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
172 |
points_list -- list of point tuples [(x0, y0), (x1, y1), (x2, y2), ...]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
173 |
(Unclosed polygons will be closed automatically.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
174 |
precision -- Internal arithmetic precision (integer arithmetic).
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
175 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
176 |
>>> polygon_area([(0, 0), (0, 1), (1, 1), (1, 2), (2, 2), (2, 0), (0, 0)])
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
177 |
3.0
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
178 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
179 |
Credits:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
180 |
Area of a General Polygon by David Chandler
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
181 |
http://www.davidchandler.com/AreaOfAGeneralPolygon.pdf
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
182 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
183 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
184 |
# Scale up co-ordinates and convert them to integers.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
185 |
for i in range(len(points_list)):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
186 |
points_list[i] = (int(points_list[i][0] * precision),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
187 |
int(points_list[i][1] * precision))
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
188 |
# Close polygon if not closed.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
189 |
if points_list[-1] != points_list[0]:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
190 |
points_list.append(points_list[0])
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
191 |
# Calculate area.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
192 |
area = 0
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
193 |
for i in range(len(points_list)-1):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
194 |
(x_i, y_i) = points_list[i]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
195 |
(x_i_plus_1, y_i_plus_1) = points_list[i+1]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
196 |
area = area + (x_i_plus_1 * y_i) - (y_i_plus_1 * x_i)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
197 |
area = abs(area / 2)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
198 |
# Unscale area.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
199 |
area = float(area)/(precision**2)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
200 |
return area
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
201 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
202 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
203 |
def timestamp():
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
204 |
"""Return string containing current time stamp.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
205 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
206 |
Note: In Python 2 onwards can use time.asctime() with no arguments.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
207 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
208 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
209 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
210 |
return time.asctime()
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
211 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
212 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
213 |
def pt2str(point):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
214 |
"""Return prettier string version of point tuple.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
215 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
216 |
>>> pt2str((1.8, 1.9))
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
217 |
'(1.8, 1.9)'
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
218 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
219 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
220 |
return "(%s, %s)" % (str(point[0]), str(point[1]))
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
221 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
222 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
223 |
def gcf(a, b, epsilon=1e-16):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
224 |
"""Return the greatest common factor of a and b, using Euclidean algorithm.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
225 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
226 |
Arguments:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
227 |
a, b -- two numbers
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
228 |
If both numbers are integers return an integer result,
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
229 |
otherwise return a float result.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
230 |
epsilon -- floats less than this magnitude are considered to be zero
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
231 |
(default: 1e-16)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
232 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
233 |
Examples:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
234 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
235 |
>>> gcf(12, 34)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
236 |
2
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
237 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
238 |
>>> gcf(13.5, 4)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
239 |
0.5
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
240 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
241 |
>>> gcf(-2, 4)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
242 |
2
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
243 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
244 |
>>> gcf(5, 0)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
245 |
5
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
246 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
247 |
By (a convenient) definition:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
248 |
>>> gcf(0, 0)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
249 |
0
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
250 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
251 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
252 |
result = max(a, b)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
253 |
remainder = min(a, b)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
254 |
while remainder and abs(remainder) > epsilon:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
255 |
new_remainder = result % remainder
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
256 |
result = remainder
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
257 |
remainder = new_remainder
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
258 |
return abs(result)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
259 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
260 |
def lcm(a, b, precision=None):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
261 |
"""Return the least common multiple of a and b, using the gcf function.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
262 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
263 |
Arguments:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
264 |
a, b -- two numbers. If both are integers return an integer result,
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
265 |
otherwise a return a float result.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
266 |
precision -- scaling factor if a and/or b are floats.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
267 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
268 |
>>> lcm(21, 6)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
269 |
42
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
270 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
271 |
>>> lcm(2.5, 3.5)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
272 |
17.5
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
273 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
274 |
>>> str(lcm(1.5e-8, 2.5e-8, precision=1e9))
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
275 |
'7.5e-08'
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
276 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
277 |
By (an arbitary) definition:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
278 |
>>> lcm(0, 0)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
279 |
0
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
280 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
281 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
282 |
# Note: Dummy precision argument is for backwards compatibility.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
283 |
# Do the division first.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
284 |
# (See http://en.wikipedia.org/wiki/Least_common_multiple )
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
285 |
denom = gcf(a, b)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
286 |
if denom == 0:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
287 |
result = 0
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
288 |
else:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
289 |
result = a * (b / denom)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
290 |
return result
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
291 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
292 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
293 |
def permutations(input_list):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
294 |
"""Return a list containing all permutations of the input list.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
295 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
296 |
Note: This is a recursive function.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
297 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
298 |
>>> perms = permutations(['a', 'b', 'c'])
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
299 |
>>> perms.sort()
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
300 |
>>> for perm in perms:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
301 |
... print perm
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
302 |
['a', 'b', 'c']
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
303 |
['a', 'c', 'b']
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
304 |
['b', 'a', 'c']
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
305 |
['b', 'c', 'a']
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
306 |
['c', 'a', 'b']
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
307 |
['c', 'b', 'a']
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
308 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
309 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
310 |
out_lists = []
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
311 |
if len(input_list) > 1:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
312 |
# Extract first item in list.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
313 |
item = input_list[0]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
314 |
# Find all permutations of remainder of list. (Recursive call.)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
315 |
sub_lists = permutations(input_list[1:])
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
316 |
# For every permutation of the sub list...
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
317 |
for sub_list in sub_lists:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
318 |
# Insert the extracted first item at every position of the list.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
319 |
for i in range(len(input_list)):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
320 |
new_list = sub_list[:]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
321 |
new_list.insert(i, item)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
322 |
out_lists.append(new_list)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
323 |
else:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
324 |
# Termination condition: only one item in input list.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
325 |
out_lists = [input_list]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
326 |
return out_lists
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
327 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
328 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
329 |
def reduce_fraction(fraction):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
330 |
"""Reduce fraction tuple to simplest form. fraction=(num, denom)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
331 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
332 |
>>> reduce_fraction((14, 7))
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
333 |
(2, 1)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
334 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
335 |
>>> reduce_fraction((-2, 4))
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
336 |
(-1, 2)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
337 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
338 |
>>> reduce_fraction((0, 4))
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
339 |
(0, 1)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
340 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
341 |
>>> reduce_fraction((4, 0))
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
342 |
(1, 0)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
343 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
344 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
345 |
(numerator, denominator) = fraction
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
346 |
common_factor = abs(gcf(numerator, denominator))
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
347 |
result = (numerator/common_factor, denominator/common_factor)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
348 |
return result
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
349 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
350 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
351 |
def quantile(l, p):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
352 |
"""Return p quantile of list l. E.g. p=0.25 for q1.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
353 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
354 |
See:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
355 |
http://rweb.stat.umn.edu/R/library/base/html/quantile.html
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
356 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
357 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
358 |
l_sort = l[:]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
359 |
l_sort.sort()
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
360 |
n = len(l)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
361 |
r = 1 + ((n - 1) * p)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
362 |
i = int(r)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
363 |
f = r - i
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
364 |
if i < n:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
365 |
result = (1-f)*l_sort[i-1] + f*l_sort[i]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
366 |
else:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
367 |
result = l_sort[i-1]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
368 |
return result
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
369 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
370 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
371 |
def trim(l):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
372 |
"""Discard values in list more than 1.5*IQR outside IQR.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
373 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
374 |
(IQR is inter-quartile-range)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
375 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
376 |
This function uses rad_util.quantile
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
377 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
378 |
1.5*IQR -- mild outlier
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
379 |
3*IQR -- extreme outlier
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
380 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
381 |
See:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
382 |
http://wind.cc.whecn.edu/~pwildman/statnew/section_7_-_exploratory_data_analysis.htm
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
383 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
384 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
385 |
l_sort = l[:]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
386 |
l_sort.sort()
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
387 |
# Calculate medianscore (based on stats.py lmedianscore by Gary Strangman)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
388 |
if len(l_sort) % 2 == 0:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
389 |
# If even number of scores, average middle 2.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
390 |
index = int(len(l_sort) / 2) # Integer division correct
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
391 |
median = float(l_sort[index] + l_sort[index-1]) / 2
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
392 |
else:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
393 |
# int divsion gives mid value when count from 0
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
394 |
index = int(len(l_sort) / 2)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
395 |
median = l_sort[index]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
396 |
# Calculate IQR.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
397 |
q1 = quantile(l_sort, 0.25)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
398 |
q3 = quantile(l_sort, 0.75)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
399 |
iqr = q3 - q1
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
400 |
iqr_extra = iqr * 1.5
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
401 |
def in_interval(x, i=iqr_extra, q1=q1, q3=q3):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
402 |
return (x >= q1-i and x <= q3+i)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
403 |
l_trimmed = [x for x in l_sort if in_interval(x)]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
404 |
return l_trimmed
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
405 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
406 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
407 |
def nice_units(value, dp=0, sigfigs=None, suffix='', space=' ',
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
408 |
use_extra_prefixes=False, use_full_name=False, mode='si'):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
409 |
"""Return value converted to human readable units eg milli, micro, etc.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
410 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
411 |
Arguments:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
412 |
value -- number in base units
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
413 |
dp -- number of decimal places to display (rounded)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
414 |
sigfigs -- number of significant figures to display (rounded)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
415 |
This overrides dp if set.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
416 |
suffix -- optional unit suffix to append to unit multiplier
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
417 |
space -- seperator between value and unit multiplier (default: ' ')
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
418 |
use_extra_prefixes -- use hecto, deka, deci and centi as well if set.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
419 |
(default: False)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
420 |
use_full_name -- use full name for multiplier symbol,
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
421 |
e.g. milli instead of m
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
422 |
(default: False)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
423 |
mode -- 'si' for SI prefixes, 'bin' for binary multipliers (1024, etc.)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
424 |
(Default: 'si')
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
425 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
426 |
SI prefixes from:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
427 |
http://physics.nist.gov/cuu/Units/prefixes.html
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
428 |
(Greek mu changed to u.)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
429 |
Binary prefixes based on:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
430 |
http://physics.nist.gov/cuu/Units/binary.html
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
431 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
432 |
>>> nice_units(2e-11)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
433 |
'20 p'
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
434 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
435 |
>>> nice_units(2e-11, space='')
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
436 |
'20p'
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
437 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
438 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
439 |
si_prefixes = {1e24: ('Y', 'yotta'),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
440 |
1e21: ('Z', 'zetta'),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
441 |
1e18: ('E', 'exa'),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
442 |
1e15: ('P', 'peta'),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
443 |
1e12: ('T', 'tera'),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
444 |
1e9: ('G', 'giga'),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
445 |
1e6: ('M', 'mega'),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
446 |
1e3: ('k', 'kilo'),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
447 |
1e-3: ('m', 'milli'),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
448 |
1e-6: ('u', 'micro'),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
449 |
1e-9: ('n', 'nano'),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
450 |
1e-12: ('p', 'pico'),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
451 |
1e-15: ('f', 'femto'),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
452 |
1e-18: ('a', 'atto'),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
453 |
1e-21: ('z', 'zepto'),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
454 |
1e-24: ('y', 'yocto')
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
455 |
}
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
456 |
if use_extra_prefixes:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
457 |
si_prefixes.update({1e2: ('h', 'hecto'),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
458 |
1e1: ('da', 'deka'),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
459 |
1e-1: ('d', 'deci'),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
460 |
1e-2: ('c', 'centi')
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
461 |
})
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
462 |
bin_prefixes = {2**10: ('K', 'kilo'),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
463 |
2**20: ('M', 'mega'),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
464 |
2**30: ('G', 'mega'),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
465 |
2**40: ('T', 'tera'),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
466 |
2**50: ('P', 'peta'),
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
467 |
2**60: ('E', 'exa')
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
468 |
}
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
469 |
if mode == 'bin':
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
470 |
prefixes = bin_prefixes
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
471 |
else:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
472 |
prefixes = si_prefixes
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
473 |
prefixes[1] = ('', '') # Unity.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
474 |
# Determine appropriate multiplier.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
475 |
multipliers = prefixes.keys()
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
476 |
multipliers.sort()
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
477 |
mult = None
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
478 |
for i in range(len(multipliers) - 1):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
479 |
lower_mult = multipliers[i]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
480 |
upper_mult = multipliers[i+1]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
481 |
if lower_mult <= value < upper_mult:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
482 |
mult_i = i
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
483 |
break
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
484 |
if mult is None:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
485 |
if value < multipliers[0]:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
486 |
mult_i = 0
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
487 |
elif value >= multipliers[-1]:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
488 |
mult_i = len(multipliers) - 1
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
489 |
mult = multipliers[mult_i]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
490 |
# Convert value for this multiplier.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
491 |
new_value = value / mult
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
492 |
# Deal with special case due to rounding.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
493 |
if sigfigs is None:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
494 |
if mult_i < (len(multipliers) - 1) and \
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
495 |
round(new_value, dp) == \
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
496 |
round((multipliers[mult_i+1] / mult), dp):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
497 |
mult = multipliers[mult_i + 1]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
498 |
new_value = value / mult
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
499 |
# Concatenate multiplier symbol.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
500 |
if use_full_name:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
501 |
label_type = 1
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
502 |
else:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
503 |
label_type = 0
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
504 |
# Round and truncate to appropriate precision.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
505 |
if sigfigs is None:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
506 |
str_value = eval('"%.'+str(dp)+'f" % new_value', locals(), {})
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
507 |
else:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
508 |
str_value = eval('"%.'+str(sigfigs)+'g" % new_value', locals(), {})
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
509 |
return str_value + space + prefixes[mult][label_type] + suffix
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
510 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
511 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
512 |
def uniquify(seq, preserve_order=False):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
513 |
"""Return sequence with duplicate items in sequence seq removed.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
514 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
515 |
The code is based on usenet post by Tim Peters.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
516 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
517 |
This code is O(N) if the sequence items are hashable, O(N**2) if not.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
518 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
519 |
Peter Bengtsson has a blog post with an empirical comparison of other
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
520 |
approaches:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
521 |
http://www.peterbe.com/plog/uniqifiers-benchmark
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
522 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
523 |
If order is not important and the sequence items are hashable then
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
524 |
list(set(seq)) is readable and efficient.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
525 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
526 |
If order is important and the sequence items are hashable generator
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
527 |
expressions can be used (in py >= 2.4) (useful for large sequences):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
528 |
seen = set()
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
529 |
do_something(x for x in seq if x not in seen or seen.add(x))
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
530 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
531 |
Arguments:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
532 |
seq -- sequence
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
533 |
preserve_order -- if not set the order will be arbitrary
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
534 |
Using this option will incur a speed penalty.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
535 |
(default: False)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
536 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
537 |
Example showing order preservation:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
538 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
539 |
>>> uniquify(['a', 'aa', 'b', 'b', 'ccc', 'ccc', 'd'], preserve_order=True)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
540 |
['a', 'aa', 'b', 'ccc', 'd']
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
541 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
542 |
Example using a sequence of un-hashable items:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
543 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
544 |
>>> uniquify([['z'], ['x'], ['y'], ['z']], preserve_order=True)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
545 |
[['z'], ['x'], ['y']]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
546 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
547 |
The sorted output or the non-order-preserving approach should equal
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
548 |
that of the sorted order-preserving approach output:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
549 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
550 |
>>> unordered = uniquify([3, 3, 1, 2], preserve_order=False)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
551 |
>>> unordered.sort()
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
552 |
>>> ordered = uniquify([3, 3, 1, 2], preserve_order=True)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
553 |
>>> ordered.sort()
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
554 |
>>> ordered
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
555 |
[1, 2, 3]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
556 |
>>> int(ordered == unordered)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
557 |
1
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
558 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
559 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
560 |
try:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
561 |
# Attempt fast algorithm.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
562 |
d = {}
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
563 |
if preserve_order:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
564 |
# This is based on Dave Kirby's method (f8) noted in the post:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
565 |
# http://www.peterbe.com/plog/uniqifiers-benchmark
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
566 |
return [x for x in seq if (x not in d) and not d.__setitem__(x, 0)]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
567 |
else:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
568 |
for x in seq:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
569 |
d[x] = 0
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
570 |
return d.keys()
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
571 |
except TypeError:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
572 |
# Have an unhashable object, so use slow algorithm.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
573 |
result = []
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
574 |
app = result.append
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
575 |
for x in seq:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
576 |
if x not in result:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
577 |
app(x)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
578 |
return result
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
579 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
580 |
# Alias to noun form for backward compatibility.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
581 |
unique = uniquify
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
582 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
583 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
584 |
def reverse_dict(d):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
585 |
"""Reverse a dictionary so the items become the keys and vice-versa.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
586 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
587 |
Note: The results will be arbitrary if the items are not unique.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
588 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
589 |
>>> d = reverse_dict({'a': 1, 'b': 2})
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
590 |
>>> d_items = d.items()
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
591 |
>>> d_items.sort()
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
592 |
>>> d_items
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
593 |
[(1, 'a'), (2, 'b')]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
594 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
595 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
596 |
result = {}
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
597 |
for key, value in d.items():
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
598 |
result[value] = key
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
599 |
return result
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
600 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
601 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
602 |
def lsb(x, n):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
603 |
"""Return the n least significant bits of x.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
604 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
605 |
>>> lsb(13, 3)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
606 |
5
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
607 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
608 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
609 |
return x & ((2 ** n) - 1)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
610 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
611 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
612 |
def gray_encode(i):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
613 |
"""Gray encode the given integer."""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
614 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
615 |
return i ^ (i >> 1)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
616 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
617 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
618 |
def random_vec(bits, max_value=None):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
619 |
"""Generate a random binary vector of length bits and given max value."""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
620 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
621 |
vector = ""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
622 |
for _ in range(int(bits / 10) + 1):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
623 |
i = int((2**10) * random.random())
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
624 |
vector += int2bin(i, 10)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
625 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
626 |
if max_value and (max_value < 2 ** bits - 1):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
627 |
vector = int2bin((int(vector, 2) / (2 ** bits - 1)) * max_value, bits)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
628 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
629 |
return vector[0:bits]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
630 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
631 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
632 |
def binary_range(bits):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
633 |
"""Return a list of all possible binary numbers in order with width=bits.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
634 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
635 |
It would be nice to extend it to match the
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
636 |
functionality of python's range() built-in function.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
637 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
638 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
639 |
l = []
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
640 |
v = ['0'] * bits
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
641 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
642 |
toggle = [1] + [0] * bits
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
643 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
644 |
while toggle[bits] != 1:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
645 |
v_copy = v[:]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
646 |
v_copy.reverse()
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
647 |
l.append(''.join(v_copy))
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
648 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
649 |
toggle = [1] + [0]*bits
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
650 |
i = 0
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
651 |
while i < bits and toggle[i] == 1:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
652 |
if toggle[i]:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
653 |
if v[i] == '0':
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
654 |
v[i] = '1'
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
655 |
toggle[i+1] = 0
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
656 |
else:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
657 |
v[i] = '0'
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
658 |
toggle[i+1] = 1
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
659 |
i += 1
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
660 |
return l
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
661 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
662 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
663 |
def float_range(start, stop=None, step=None):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
664 |
"""Return a list containing an arithmetic progression of floats.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
665 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
666 |
Return a list of floats between 0.0 (or start) and stop with an
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
667 |
increment of step.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
668 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
669 |
This is in functionality to python's range() built-in function
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
670 |
but can accept float increments.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
671 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
672 |
As with range(), stop is omitted from the list.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
673 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
674 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
675 |
if stop is None:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
676 |
stop = float(start)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
677 |
start = 0.0
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
678 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
679 |
if step is None:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
680 |
step = 1.0
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
681 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
682 |
cur = float(start)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
683 |
l = []
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
684 |
while cur < stop:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
685 |
l.append(cur)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
686 |
cur += step
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
687 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
688 |
return l
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
689 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
690 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
691 |
def find_common_fixes(s1, s2):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
692 |
"""Find common (prefix, suffix) of two strings.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
693 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
694 |
>>> find_common_fixes('abc', 'def')
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
695 |
('', '')
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
696 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
697 |
>>> find_common_fixes('abcelephantdef', 'abccowdef')
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
698 |
('abc', 'def')
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
699 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
700 |
>>> find_common_fixes('abcelephantdef', 'abccow')
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
701 |
('abc', '')
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
702 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
703 |
>>> find_common_fixes('elephantdef', 'abccowdef')
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
704 |
('', 'def')
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
705 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
706 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
707 |
prefix = []
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
708 |
suffix = []
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
709 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
710 |
i = 0
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
711 |
common_len = min(len(s1), len(s2))
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
712 |
while i < common_len:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
713 |
if s1[i] != s2[i]:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
714 |
break
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
715 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
716 |
prefix.append(s1[i])
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
717 |
i += 1
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
718 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
719 |
i = 1
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
720 |
while i < (common_len + 1):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
721 |
if s1[-i] != s2[-i]:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
722 |
break
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
723 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
724 |
suffix.append(s1[-i])
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
725 |
i += 1
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
726 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
727 |
suffix.reverse()
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
728 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
729 |
prefix = ''.join(prefix)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
730 |
suffix = ''.join(suffix)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
731 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
732 |
return (prefix, suffix)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
733 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
734 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
735 |
def is_rotated(seq1, seq2):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
736 |
"""Return true if the first sequence is a rotation of the second sequence.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
737 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
738 |
>>> seq1 = ['A', 'B', 'C', 'D']
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
739 |
>>> seq2 = ['C', 'D', 'A', 'B']
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
740 |
>>> int(is_rotated(seq1, seq2))
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
741 |
1
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
742 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
743 |
>>> seq2 = ['C', 'D', 'B', 'A']
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
744 |
>>> int(is_rotated(seq1, seq2))
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
745 |
0
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
746 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
747 |
>>> seq1 = ['A', 'B', 'C', 'A']
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
748 |
>>> seq2 = ['A', 'A', 'B', 'C']
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
749 |
>>> int(is_rotated(seq1, seq2))
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
750 |
1
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
751 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
752 |
>>> seq2 = ['A', 'B', 'C', 'A']
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
753 |
>>> int(is_rotated(seq1, seq2))
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
754 |
1
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
755 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
756 |
>>> seq2 = ['A', 'A', 'C', 'B']
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
757 |
>>> int(is_rotated(seq1, seq2))
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
758 |
0
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
759 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
760 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
761 |
# Do a sanity check.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
762 |
if len(seq1) != len(seq2):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
763 |
return False
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
764 |
# Look for occurrences of second sequence head item in first sequence.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
765 |
start_indexes = []
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
766 |
head_item = seq2[0]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
767 |
for index1 in range(len(seq1)):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
768 |
if seq1[index1] == head_item:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
769 |
start_indexes.append(index1)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
770 |
# Check that wrapped sequence matches.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
771 |
double_seq1 = seq1 + seq1
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
772 |
for index1 in start_indexes:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
773 |
if double_seq1[index1:index1+len(seq1)] == seq2:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
774 |
return True
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
775 |
return False
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
776 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
777 |
def getmodule(obj):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
778 |
"""Return the module that contains the object definition of obj.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
779 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
780 |
Note: Use inspect.getmodule instead.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
781 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
782 |
Arguments:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
783 |
obj -- python obj, generally a class or a function
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
784 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
785 |
Examples:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
786 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
787 |
A function:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
788 |
>>> module = getmodule(random.choice)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
789 |
>>> module.__name__
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
790 |
'random'
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
791 |
>>> module is random
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
792 |
1
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
793 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
794 |
A class:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
795 |
>>> module = getmodule(random.Random)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
796 |
>>> module.__name__
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
797 |
'random'
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
798 |
>>> module is random
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
799 |
1
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
800 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
801 |
A class inheriting from a class in another module:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
802 |
(note: The inheriting class must define at least one function.)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
803 |
>>> class MyRandom(random.Random):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
804 |
... def play(self):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
805 |
... pass
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
806 |
>>> module = getmodule(MyRandom)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
807 |
>>> if __name__ == '__main__':
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
808 |
... name = 'rad_util'
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
809 |
... else:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
810 |
... name = module.__name__
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
811 |
>>> name
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
812 |
'rad_util'
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
813 |
>>> module is sys.modules[__name__]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
814 |
1
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
815 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
816 |
Discussion:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
817 |
This approach is slightly hackish, and won't work in various situations.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
818 |
However, this was the approach recommended by GvR, so it's as good as
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
819 |
you'll get.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
820 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
821 |
See GvR's post in this thread:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
822 |
http://groups.google.com.au/group/comp.lang.python/browse_thread/thread/966a7bdee07e3b34/c3cab3f41ea84236?lnk=st&q=python+determine+class+module&rnum=4&hl=en#c3cab3f41ea84236
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
823 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
824 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
825 |
if hasattr(obj, 'func_globals'):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
826 |
func = obj
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
827 |
else:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
828 |
# Handle classes.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
829 |
func = None
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
830 |
for item in obj.__dict__.values():
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
831 |
if hasattr(item, 'func_globals'):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
832 |
func = item
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
833 |
break
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
834 |
if func is None:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
835 |
raise ValueError("No functions attached to object: %r" % obj)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
836 |
module_name = func.func_globals['__name__']
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
837 |
# Get module.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
838 |
module = sys.modules[module_name]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
839 |
return module
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
840 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
841 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
842 |
def round_grid(value, grid, mode=0):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
843 |
"""Round off the given value to the given grid size.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
844 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
845 |
Arguments:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
846 |
value -- value to be roudne
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
847 |
grid -- result must be a multiple of this
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
848 |
mode -- 0 nearest, 1 up, -1 down
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
849 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
850 |
Examples:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
851 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
852 |
>>> round_grid(7.5, 5)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
853 |
10
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
854 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
855 |
>>> round_grid(7.5, 5, mode=-1)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
856 |
5
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
857 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
858 |
>>> round_grid(7.3, 5, mode=1)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
859 |
10
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
860 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
861 |
>>> round_grid(7.3, 5.0, mode=1)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
862 |
10.0
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
863 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
864 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
865 |
off_grid = value % grid
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
866 |
if mode == 0:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
867 |
add_one = int(off_grid >= (grid / 2.0))
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
868 |
elif mode == 1 and off_grid:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
869 |
add_one = 1
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
870 |
elif mode == -1 and off_grid:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
871 |
add_one = 0
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
872 |
result = ((int(value / grid) + add_one) * grid)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
873 |
return result
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
874 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
875 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
876 |
def get_args(argv):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
877 |
"""Store command-line args in a dictionary.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
878 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
879 |
-, -- prefixes are removed
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
880 |
Items not prefixed with - or -- are stored as a list, indexed by 'args'
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
881 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
882 |
For options that take a value use --option=value
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
883 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
884 |
Consider using optparse or getopt (in Python standard library) instead.
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
885 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
886 |
"""
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
887 |
d = {}
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
888 |
args = []
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
889 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
890 |
for arg in argv:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
891 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
892 |
if arg.startswith('-'):
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
893 |
parts = re.sub(r'^-+', '', arg).split('=')
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
894 |
if len(parts) == 2:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
895 |
d[parts[0]] = parts[1]
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
896 |
else:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
897 |
d[parts[0]] = None
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
898 |
else:
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
899 |
args.append(arg)
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
900 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
901 |
d['args'] = args
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
902 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
903 |
return d
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
904 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
905 |
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
906 |
if __name__ == '__main__':
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
907 |
import doctest
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
908 |
doctest.testmod(sys.modules['__main__'])
|
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents:
diff
changeset
|
909 |
|