Passed
Push — master ( aab108...0177cd )
by Ken M.
01:13
created

min_max.min()   A

Complexity

Conditions 2

Size

Total Lines 8
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 7
nop 2
dl 0
loc 8
rs 10
c 0
b 0
f 0
1
import types
2
3
4
def parse_args(args, key):
5
    # apply key func to all args
6
    ret = [key(i) for i in args]
7
    return ret
8
9
10
def nomalise_args(*args):
11
    # turn args to a single level list
12
    new_args = [None]
13
    while len(new_args) == 1:
14
        new_args = list(args[0])
15
        if isinstance(new_args, types.GeneratorType):
16
            new_args = list(new_args)
17
        if new_args == args[0] or type(new_args[0]) in [int, float]:
18
            break
19
        args = new_args
20
    return new_args
21
22
23
def find_value(args, biggest=True):
24
    # find the max/min by iteration
25
    index = 0
26
    value = args[0]
27
    for i, v in enumerate(args):
28
        if (biggest and v > value) or (not biggest and v < value):
29
            index = i
30
            value = v
31
    return index
32
33
34
def min(*args, **kwargs):
35
    key = kwargs.get("key", None)
36
    nomalised_args = nomalise_args(args)
37
    if key:
38
        parsed_args = parse_args(nomalised_args, key)
39
    else:
40
        parsed_args = nomalised_args
41
    return nomalised_args[find_value(parsed_args, False)]
42
43
44
def max(*args, **kwargs):
45
    key = kwargs.get("key", None)
46
    nomalised_args = nomalise_args(args)
47
    if key:
48
        parsed_args = parse_args(nomalised_args, key)
49
    else:
50
        parsed_args = nomalised_args
51
    return nomalised_args[find_value(parsed_args)]
52
53
54
if __name__ == '__main__':  # pragma: no cover
55
    # These "asserts" using only for self-checking and not necessary for
56
    # auto-testing
57
    assert max(3, 2) == 3, "Simple case max"
58
    assert min(3, 2) == 2, "Simple case min"
59
    assert max([1, 2, 0, 3, 4]) == 4, "From a list"
60
    assert min("hello") == "e", "From string"
61
    assert max(2.2, 5.6, 5.9, key=int) == 5.6, "Two maximal items"
62
    assert min([[1, 2], [3, 4], [9, 0]], key=lambda x: x[1]) == [9, 0], "lambda key"
63