Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
November 30, 2020 08:02 am GMT

Manipulating Lists in Python 3 for Competitive Programming

Introduction

Today we will discuss some tips on manipulating lists in Python 3 that will help you especially in competitive programming

We will discuss four techniques:

  • Performing Multiple Swaps on Rows and columns Efficiently

  • Initializing a 2D Matrix

  • Deleting an Element from a List That Youre Iterating Upon

  • Getting the Transpose of a Matrix

Performing Multiple Swaps on Rows and columns Efficiently

Steps:

  • Store the matrix in a list of lists

  • Create two dictionaries, one for the rows (that has size equal to the number of rows), and another for the columns (has size equal to the number of columns)

  • Both keys and values are initialized to the initial indexing of the matrix

  • The keys for those dictionaries are the original value for the indices of the matrix, the values are the indices after all swap operations

  • We will access matrix elements using those dictionaries only

Sample Code:

matrix = [[1, 2, 3], [4, 5, 6]]col = {i : i for i in range (3)} # creating columns maprow = {i : i for i in range (2)} # creating rows map# I will perform three swaps, but you could extend to way more than that!col[0], col[1] = col[1], col[0] # first swaprow[0], row[1] = row[1], row[0] # second swapcol[2], col[0] = col[0], col[2] # third swapfor i in matrix : # printing the original matrix before the swaps    print (i)'''output:[1, 2, 3][4, 5, 6]'''# printing the matrix after the swapsfor i in range (2) : # iterate through the whole matrix    for j in range (3) :        print (matrix [row[i]][col[j]], end = ' ') # accessing the matrix using the two maps    print ()'''output:6 4 5 3 1 2 '''
Enter fullscreen mode Exit fullscreen mode

Initializing a 2D Matrix

It seems like an easy topic, but there is a trick that a lot of people dont get at the first glance

I will show you the wrong way that many got mistaken over, then I will show you the correct method of doing it

The Wrong Method

  • This method will create four references, all to the same 1-D list
  • If you changed any element in the first 1-D list, it will affect the rest of the lists (will affect all elements with the same index as in the first list)

  • This is because the reference of the first list is the same reference to the rest of the list

Sample Code:

# The WRONG way# DO NOT DO THIS!matrix = [[0] * 3] * 4 # initializationmatrix[0][0] = 1 # changefor i in matrix :    print (i)'''output:[1, 0, 0][1, 0, 0][1, 0, 0][1, 0, 0][1, 0, 0]'''
Enter fullscreen mode Exit fullscreen mode

The Right Method

  • We will use a for loop, It's equivalent to writing multiple statements
  • This will create multiple references, one for each row (1-D list)

Sample Code:

matrix = [[0] * 3 for _ in range (4)] # initializationmatrix[0][0] = 1 # changefor i in matrix :    print (i)'''output:[1, 0, 0][0, 0, 0][0, 0, 0][0, 0, 0]'''
Enter fullscreen mode Exit fullscreen mode

Deleting an Element from a List That Youre Iterating Upon

  • If we deleted some elements from a list while iterating over it, we will get the following error:

IndexError: list index out of range

Steps of deleting elements from a list while iterating over it correctly:

  • Let's call the array that we want to delete elements from (arr)

  • Make a new boolean array, and we called it (isDeleted)

  • If the current element should be deleted, then make the corresponding element in the boolean array = 1

Note that: In the boolean array, the value of one means that the elements should be deleted, value of zero means otherwise

  • Make a third array, we called it (LAfterDeletion), that will take the elements from arr that correspond to elements in the boolean array with a value of 0

Sample Code:

L = [1, 2, 3, 5, 66, 7, 8, 4, 23, 12] # making a listisDeleted = [0] * len (L) # creating the boolean arrayLAfterDeletion = [] # create the final array, that will take values after deletion# Delete the elements that are larger than 5!for i in range (len (L)) :    if L[i] > 5 :        isDeleted[i] = 1for i in range (len (isDeleted)) :    if isDeleted[i] == 0:        LAfterDeletion.append(L[i])print (LAfterDeletion) # [1, 2, 3, 5, 4]
Enter fullscreen mode Exit fullscreen mode

Getting the Transpose of a Matrix

  • The main idea is based on using the zip function

  • Zip () function takes multiple iterables and returns a generator that contains a series of tuples, where each tuple contains a series of elements, one from each iterable

  • We could cast this generator to a list

Sample Code:

lis = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # declaring the original listfor i in lis :    print (i)'''output:[1, 2, 3][4, 5, 6][7, 8, 9]'''lis = list (zip (*lis)) # first rotation (replacing rows with columns)# *lis is used to unpack the list of lists to multiple lists, equivalent to: lis[0], lis[1], lis[2]for i in lis :    print (i)'''output:(1, 4, 7)(2, 5, 8)(3, 6, 9)'''
Enter fullscreen mode Exit fullscreen mode

That's it! I hope you learned from it. Happy coding!


Original Link: https://dev.to/abdelrahmandeghedy/manipulating-lists-in-python-3-for-competitive-programming-44ni

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To