0
\$\begingroup\$

I am new to this community, I have tried this below code, this works fine, but looking for a better way of approaching for performance.

Please edit my question, it it is not understandable.

I have a string and list, I need to filter that and converting that string to a dictionary , then if a dictionary key presents in the list, we need to append the corresponding dict[value] to my list

text='p.O(post office)\nR.J(Radio Jocky)'
list1=["R.J"]
text_splitted=text.split("\n")
my_dict={}
for item in text_splitted:
    index=item.index("(")
    key=item[:index]
    value=item[index+1:len(item)-1]
    my_dict[key]=value
list2=[my_dict[item] for item in my_dict.keys() if item in list1]
list1=list1+list2
output:
list1=['R.J', 'Radio Jocky']
\$\endgroup\$
6
  • \$\begingroup\$ What is your reasoning to convert it to a dictionary first, and afterwards convert it back to a list? \$\endgroup\$
    – Ludisposed
    Commented Nov 22, 2017 at 10:01
  • \$\begingroup\$ Are all values in the text like this name(job)\n...? \$\endgroup\$
    – Ludisposed
    Commented Nov 22, 2017 at 10:02
  • \$\begingroup\$ @Ludisposed , I a value present list1, i need to append the corresponding meaning to my list1, you can see my final output R.J is already present in list1' so im adding the meaning of R.J` in the same list. To get this result im converting to dictionary and extracting the values. If there is any easy solution, please answer it \$\endgroup\$
    – pyd
    Commented Nov 22, 2017 at 10:06
  • \$\begingroup\$ some values will have two parameters like name(job,time) \$\endgroup\$
    – pyd
    Commented Nov 22, 2017 at 10:08
  • 1
    \$\begingroup\$ Please change the question title, 'how to' questions are off-topic here. And so shouldn't be a question title. \$\endgroup\$
    – Peilonrayz
    Commented Nov 22, 2017 at 10:50

1 Answer 1

3
\$\begingroup\$
  • I think the step of converting it to a list is unnecesarry, because we can check if it is in the list the same.
  • I have a solution using regex to find the corresponding name and job
  • You could use better variable names because item and list1 list2 are nondescriptive

Note that using wilcards .* would be considered bad form in a regex

You might want to change that to suit your needs.


from re import findall

def add_job(L, text):
    for line in text.split('\n'):
        name, job = findall(r"(.*)\((.*\))", line)[0]
        if name in L:
            L.append(job)
    return L

if __name__ == '__main__':
    text='p.O(post office)\nR.J(Radio Jocky)'
    list1=["R.J"]
    list1 = add_job(list1, text)
    print(list1)
\$\endgroup\$
4
  • \$\begingroup\$ Thanks for the solution, can you tell me the best resource to learn regex ? \$\endgroup\$
    – pyd
    Commented Nov 22, 2017 at 10:15
  • 2
    \$\begingroup\$ regexone.com to learn and regex101.com to check your regular expressions \$\endgroup\$
    – Ludisposed
    Commented Nov 22, 2017 at 10:20
  • \$\begingroup\$ @pyd I know you are new here, my solution is far from optimal (I think) and you could maybe have a better one if you didnt accept on first sight. Codereview works a bit different then StackOverflow and I suggest to read this meta post. And more on the meta to see the guidelines of Codereview. Have fun ^^ \$\endgroup\$
    – Ludisposed
    Commented Nov 22, 2017 at 10:24
  • \$\begingroup\$ okay, I will wait for many solutions, from next question onward :D \$\endgroup\$
    – pyd
    Commented Nov 22, 2017 at 10:27

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.