Python – Character coordinates in Matrix
Last Updated :
16 May, 2023
Sometimes, while working with Python data, we can have a problem in which we need to extract all the coordinates in Matrix, which are characters. This kind of problem can have potential application in domains such as web development and day-day programming. Let’s discuss certain ways in which this task can be performed.
Input : test_list = [‘1G’, ’12F’, ‘231G’]
Output : [(0, 1), (1, 2), (2, 3)]
Input : test_list = [‘G’, ‘F’, ‘G’]
Output : [(0, 0), (1, 0), (2, 0)]
Method #1 : Using enumerate() + list comprehension + isalpha() The combination of above functions can be used to solve this problem. In this, we perform the task of working with indices using enumerate and characters filtering is done using isalpha().
Python3
test_list = [ '23f45.;4d' , '5678d56d' , '789' , '5678g' ]
print ("The original list is : " + str (test_list))
res = [(x, y) for x, val in enumerate (test_list)
for y, chr in enumerate (val) if chr .isalpha()]
print ("Character indices : " + str (res))
|
Output :
The original list is : ['23f45.;4d', '5678d56d', '789', '5678g']
Character indices : [(0, 2), (0, 8), (1, 4), (1, 7), (3, 4)]
Time Complexity: O(n*n) where n is the number of elements in the list “test_list”. enumerate() + list comprehension + isalpha() performs n*n number of operations.
Auxiliary Space: O(n), extra space is required where n is the number of elements in the list
Method #2 : Using regex() + loop The combination of above functions can be used to solve this problem. In this, we perform task of filtering alphabets using regex expressions. Just returns the first occurrence of character in each string.
Python3
import re
test_list = [ '23f45.;4d' , '5678d56d' , '789' , '5678g' ]
print ("The original list is : " + str (test_list))
res = []
for key, val in enumerate (test_list):
temp = re.search( '([a-zA-Z]+)' , val)
if temp :
res.append((key, temp.start()))
print ("Character indices : " + str (res))
|
Output :
The original list is : ['23f45.;4d', '5678d56d', '789', '5678g']
Character indices : [(0, 2), (1, 4), (3, 4)]
Method 3: Using itertools.product()
In this method, we can use the itertools.product() method to generate all possible (x,y) coordinates for the matrix. We can then use list comprehension to filter out the coordinates where the corresponding character is an alphabet.
Python3
from itertools import product
test_list = [ '23f45.;4d' , '5678d56d' , '789' , '5678g' ]
print ( "The original list is : " + str (test_list))
n = max ( len (s) for s in test_list)
res = [(x, y) for x, y in product( range ( len (test_list)), range (n))
if y < len (test_list[x]) and test_list[x][y].isalpha()]
print ( "Character indices : " + str (res))
|
Output
The original list is : ['23f45.;4d', '5678d56d', '789', '5678g']
Character indices : [(0, 2), (0, 8), (1, 4), (1, 7), (3, 4)]
Time complexity: O(mn) where m is the number of strings and n is the maximum length of the strings.
Auxiliary space: O(1) since we’re not using any extra data structures.
Method #4: Using map() and filter()
Use map() and filter() functions to solve this problem. map() is a built-in Python function that applies a given function to each element of an iterable and returns an iterator with the results. filter() is another built-in Python function that filters out elements from an iterable that do not satisfy a given condition.
Step-by-step approach:
- Define a lambda function that takes a tuple (i, j) as input and returns test_list[i][j] (the character at position (i, j) in test_list).
- Use the map() function to apply the lambda function to all the tuples (i, j) in the Cartesian product of the ranges range(len(test_list)) and range(max(len(s) for s in test_list))).
- Use the filter() function to keep only the tuples (i, j) for which test_list[i][j] is an alphabet.
- Return the filtered tuples as a list.
Python3
from itertools import product
test_list = [ '23f45.;4d' , '5678d56d' , '789' , '5678g' ]
print ( "The original list is : " + str (test_list))
res = list ( filter ( lambda x: x[ 1 ] < len (test_list[x[ 0 ]]) and test_list[x[ 0 ]][x[ 1 ]].isalpha(),
map ( lambda x: (x[ 0 ], x[ 1 ]), product( range ( len (test_list)), range ( max ( len (s) for s in test_list))))))
print ( "Character indices : " + str (res))
|
Output
The original list is : ['23f45.;4d', '5678d56d', '789', '5678g']
Character indices : [(0, 2), (0, 8), (1, 4), (1, 7), (3, 4)]
Time complexity: O(n^2), where n is the length of the longest string in the list.
Auxiliary space: O(n^2), where n is the length of the longest string in the list (for creating the Cartesian product).
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...