Move History

Fork Selected
  • Fundamentals
    Arrays
    Description

    I dont't like nesting more than 2 times, so I inverted the condition. Also, extracting the generator is more idiomatic way to convert it to list + it looks prettier for me.

    Code
    def flatten_list(lst):
        def flatten(l):
            for i in l:
                if not isinstance(i, (list, tuple)):
                    yield i
                    continue
                for j in flatten_list(i):
                    yield j
    
        return [*flatten(lst)]
    Test Cases
    import codewars_test as test
    from solution import flatten_list
    
    @test.describe("Fixd tests")
    def test_group():
        @test.it("test case 1:")
        def test_case():     
            s1 = [[0, 1, 2], [3, 4], [5, 6], [7, 8], [9]]       
            s2 = [[0, 1, 2, 3, 4], [5, 6, 7, 8], [9]]
            s3 = [[0], [1], [2], [3], [4], [5], [6], [7], [8], [9]]
            e1 = [0, 1, 2, 3, 4, 5, 6, 7,8, 9]
            e2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
            e3 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]        
            samples = [s1, s2, s3]
            expected = [e1, e2, e3]
            for s, e in zip(samples, expected):
                test.assert_equals(flatten_list(s),e)
    
    
    @test.describe("Random tests")
    def test_group():
        @test.it("test case 2:")
        def test_case():     
            s1 = [[0, 1, 2], (3, 4), [5, 6], (7, 8), [9]]       
            s2 = [[0, 1, 2, 3, 4], [5, 6, 7, 8], (9)]
            s3 = [(0), [1], (2), [3], (4), [5], (6), [7], (8), [9]]
            e1 = [0, 1, 2, 3, 4, 5, 6, 7,8, 9]
            e2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
            e3 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]        
            samples = [s1, s2, s3]
            expected = [e1, e2, e3]
            for s, e in zip(samples, expected):
                test.assert_equals(flatten_list(s),e)
    
    
    def test_group():
        @test.it("test case 1:")
        def test_case():     
            s1 = [0, [1, 2], 3, [4, 5], 6, [7, 8], 9]
            s2 = [0, 1, 2, [3, 4, 5], 6, 7, 8, [9]] 
            s3 = [0, [1], 2, [3], 4, [5], 6, [7], 8, [9]] 
            s4 = [0, 1, 2, [3, 4, [5], []], [6], 7, 8, [9,[]]]
            e1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
            e2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
            e3 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]   
            e4 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
            samples = [s1, s2, s3, s4]
            expected = [e1, e2, e3, e4]
            for s, e in zip(samples, expected):
                test.assert_equals(flatten_list(s),e)
                
        @test.it("test case 2:")
        def test_case():     
            s1 = [[[[[[[[-1]]]]]]]]
            s2 = [1, 2, [3, 4, [5], ['code']], [6, [[[7, 'warz']]], 8, [[[9,[]]]]]]
            s3 = ['code', [[[[1, 2, 3], 4], 5]], 6, 7, [[], 8], [9, [[], 'warz']]]    
            e1 = [-1]        
            e2 = [1, 2, 3, 4, 5, 'code', 6, 7, 'warz',8, 9 ]
            e3 = ['code', 1, 2, 3, 4, 5, 6, 7, 8, 9, 'warz']        
            samples = [s1,s2, s3]
            expected = [e1, e2, e3]
            for s, e in zip(samples, expected):
                test.assert_equals(flatten_list(s),e)
                
    @test.describe("Edge Cases")
    def test_group():            
        @test.it("test case 1:")
        def test_case():     
            s1 = [0, 1, (2, 3), [[4, 5, (6, 7, (8,), [9]), 10]], (11,)]
            s2 = [0, [[[1]]], ([2, 3], [4, [[5, 6]]])]
            s3 = [1, [3], (1, 6), [[3, 8]], [[[5]]], 9, ((((2,),),),)]
            s4 =  ['eat', (0, ([1, 2, [3, [['sleep', [[4]]]]], (((6,),),), 'code', 7, [[[8]]], 9]),), 'repeat']
            e1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
            e2 = [0, 1, 2, 3, 4, 5, 6]
            e3 = [1, 3, 1, 6, 3, 8, 5, 9, 2]
            e4 = ['eat', 0, 1, 2, 3, 'sleep', 4, 6, 'code', 7, 8, 9, 'repeat']
            samples = [s1, s2, s3, s4]
            expected = [e1, e2, e3, e4]
            for s, e in zip(samples, expected):
                test.assert_equals(flatten_list(s),e)
  • Code
    • def flatten_list(lst):
    • def flatten(l):
    • for i in l:
    • if isinstance(i, (list, tuple)):
    • for j in flatten_list(i):
    • yield j
    • else:
    • if not isinstance(i, (list, tuple)):
    • yield i
    • return list(flatten(lst))
    • continue
    • for j in flatten_list(i):
    • yield j
    • return [*flatten(lst)]