Extracting sublists of specific elements from Python lists of strings

Question:

I have a large list of elements

a = [['qc1l1.1',
 'qc1r2.1',
 'qc1r3.1',
 'qc2r1.1',
 'qc2r2.1',
 'qt1.1',
 'qc3.1',
 'qc4.1',
 'qc5.1',
 'qc6.1',.................]

From this list i want to extract several sublists for elements start with the letters "qfg1" "qdg2" "qf3" "qd1" and so on.

such that:

list1 = ['qfg1.1', 'qfg1.2',....] 
list2 = ['qfg2.1', 'qfg2.2',,,]
 

I tried to do:

list1 = []
for i in all_quads_names:
    if i in ['qfg']:
       list1.append(i)

but it gives an empty lists, how can i do this without the need of doing loops as its a very large list.

Asked By: ely66

||

Answers:

Try to revert you if statement and to compare a string to the list elements :

if "qfg" in i:

you can refer to this question :
Searching a sequence of characters from a string in python

you have many python methods to do just that described here:
https://stackabuse.com/python-check-if-string-contains-substring/

Edit after AminM coment :

From your exemple it doesn’t seem necessary to use the startwith() method, but if your sublist ("qfg") can also be found later in the string and you need to find only the string that is starting with "qfg", then you should have something like :

if i.startswith("qfg"):
Answered By: L4ur3nt

You are looking for ‘qfg’ in the ith element of the all_quads_names. So, try the following:

list1 = []
for i in all_quads_names:
    if 'qfg' in i:
       list1.append(i)
Answered By: codewhat

Try something like this:


prefixes = ['qfg1', … ]
top = [ […], […], … ]
extracted = []

for sublist in top:
    if sublist and any(prefix in sublist[0] for prefix in prefixes):
        extracted.append(sublist)

Answered By: fish2000

Using in (as others have suggested) is incorrect. Because you want to check it as a prefix not merely whether it is contained.

What you want to do is use startswith() for example this:

list1 = []
for name in all_quads_names:
    if name.startswith('qc1r'):
       list1.append(name)

The full solution would be something like:

prefixes = ['qfg', 'qc1r']
lists = []
for pref in prefixes: 
   list = []
   for name in all_quads_names:
       if name.startswith(pref):
          list.append(name)
   lists.append(list)

Now lists will contain all the lists you want.

Answered By: AminM
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.