Python Forum
Error 'object has no attribute' when iterating thru a dictionary - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: Error 'object has no attribute' when iterating thru a dictionary (/thread-17337.html)



Error 'object has no attribute' when iterating thru a dictionary - mrapple2020 - Apr-07-2019

from collections import defaultdict
arch_dic = {}
arch_dic = defaultdict(list)
arch_dic['PSE2'].append("0/7/CPU0")
arch_dic['PSE2'].append("1/7/CPU0")
interface=['0/7']
for k, v in arch_dic.items():
    print(v)                                 #<=== My desire here is to see if "interface" matches any elements of Values.

#['0/7/CPU0', '1/7/CPU0']                   #    <== value in the dictionary

result = v.find(interface)                 #<== I tried to use 'find', but getting an error.I would need a better to iterate thru "values". 
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'find'
>>>


RE: Error 'object has no attribute' when iterating thru a dictionary - ichabod801 - Apr-07-2019

Try index instead of find. If it might not be in the list, use if interface in v first, or use a try/except block.


RE: Error 'object has no attribute' when iterating thru a dictionary - Yoriz - Apr-07-2019

from collections import defaultdict
arch_dic = {}
arch_dic = defaultdict(list)
arch_dic['PSE2'].append("0/7/CPU0")
arch_dic['PSE2'].append("1/7/CPU0")
interface = '0/7' # removed the []
for k, v in arch_dic.items():
    print([index for index, value in enumerate(v) if interface in value]) # prints a list of indexes that interface was found in
Output:
[0]



RE: Error 'object has no attribute' when iterating thru a dictionary - mrapple2020 - Apr-07-2019

Update:
if I do
match = '0/7/CPU0' #match is the 'interface' variable.
Then I get a match now. Ding. Maybe I need to extract the /CPU0 info from the list of CPU value....

Output:

Interface:0/7/CPU0 CPU list:['0/7/CPU0', '1/0/CPU0', '1/2/CPU0']
[0]
Interface:0/7/CPU0 CPU list:['0/7/CPU0', '1/0/CPU0', '1/2/CPU0']
[0]
exit...


(Apr-07-2019, 09:52 PM)mrapple2020 Wrote: Hello, I tried both suggestions and it is not triggering a match. Any other options?
#match is the 'interface' variable. I tried both '0/7' and ['0/7']. It does not find a match.
match='[0/7]' 
    if match:
               for k, v in arch_dic.items():
                   print (f'Interface:{match}   CPU list:{v}')
                   if match in v:

                       #print('Interface {match} is in {v};  PSE2...')
                       print([index for index, value in enumerate(v) if match in value])
#Result of the print above is this. As we can see, there is an interface '0/7' which should cause a match against the CPU list. It is not working. Any ideas?
Interface:['0/5'] CPU list:['0/7/CPU0', '1/0/CPU0', '1/2/CPU0']
Interface:['0/7'] CPU list:['0/7/CPU0', '1/0/CPU0', '1/2/CPU0']
exit...



RE: Error 'object has no attribute' when iterating thru a dictionary - Yoriz - Apr-07-2019

from collections import defaultdict
arch_dic = {}
arch_dic = defaultdict(list)
arch_dic['PSE2'].append("0/7/CPU0")
arch_dic['PSE2'].append("1/7/CPU0")
arch_dic['PSE2'].append("0/7/CPU0")
arch_dic['PSE2'].append("0/7/CPU0")
arch_dic['PSE2'].append("1/7/CPU0")
match='0/7' 

for k, v in arch_dic.items():
    print (f'Interface:{match}   CPU list:{v}')
    print([index for index, value in enumerate(v) if match in value])
Output:
Interface:0/7 CPU list:['0/7/CPU0', '1/7/CPU0', '0/7/CPU0', '0/7/CPU0', '1/7/CPU0'] [0, 2, 3]
if match in v will only match if the whole string matches, the above will find any index with the partial sting in.


RE: Error 'object has no attribute' when iterating thru a dictionary - mrapple2020 - Apr-07-2019

I executed your suggestion below (removed if match). Then I got this error:
print([index for index, value in enumerate(v) if match in value])
TypeError: 'in <string>' requires string as left operand, not list


Now I converted both values 'v' and interface 'match' variables to string.

Now the result I see is the below. I am getting no matches at this point. In my case the output of 'interfaces' and 'CPU' is coming from an appliance. I am printing the original value for you to see it. So if I try the 'index', I get the error above complaining it requires a string. But then if I convert it to string, the operations with 'index' may no longer be valid, correct?

print (f'Original data from appliance, dictionary:{arch_dic}')

for k, v in arch_dic.items():
    v = str(v)
    match = str(match)
    print(f'type of values v {type(v)} {v} and type of interface:{type(match)} {match} ')
    print([index for index, value in enumerate(v) if match in value])
#I am not getting a match:

Original data from appliance, dictionary:defaultdict(<class 'list'>, {'PSE2': ['0/7/CPU0', '1/0/CPU0', '1/2/CPU0']})
type of values v <class 'str'> ['0/7/CPU0', '1/0/CPU0', '1/2/CPU0'] and type of interface:<class 'str'> ['0/5']
[]
Original data from appliance, dictionary:defaultdict(<class 'list'>, {'PSE2': ['0/7/CPU0', '1/0/CPU0', '1/2/CPU0']})
type of values v <class 'str'> ['0/7/CPU0', '1/0/CPU0', '1/2/CPU0'] and type of interface:<class 'str'> ['0/7']
[]
exit...


(Apr-07-2019, 09:59 PM)Yoriz Wrote:
from collections import defaultdict
arch_dic = {}
arch_dic = defaultdict(list)
arch_dic['PSE2'].append("0/7/CPU0")
arch_dic['PSE2'].append("1/7/CPU0")
arch_dic['PSE2'].append("0/7/CPU0")
arch_dic['PSE2'].append("0/7/CPU0")
arch_dic['PSE2'].append("1/7/CPU0")
match='0/7' 

for k, v in arch_dic.items():
    print (f'Interface:{match}   CPU list:{v}')
    print([index for index, value in enumerate(v) if match in value])
Output:
Interface:0/7 CPU list:['0/7/CPU0', '1/7/CPU0', '0/7/CPU0', '0/7/CPU0', '1/7/CPU0'] [0, 2, 3]
if match in v will only match if the whole string matches, the above will find any index with the partial sting in.



RE: Error 'object has no attribute' when iterating thru a dictionary - Yoriz - Apr-07-2019

Show full run able code like mine was
the error
Error:
TypeError: 'in <string>' requires string as left operand, not list
shows that match was assigned as list instead of a string
to try and correct that you converted it into a string
the string ['0/7'] won't match 0/7/CPU0
as it shows in my code you quoted, match should be a string
match='0/7'
v is already a string and does not need converting.


RE: Error 'object has no attribute' when iterating thru a dictionary - mrapple2020 - Apr-07-2019

Wait a minute.
If I do:
#Interface variable match:
match='0/7'

Then I execute it and I get a match. So it seems the issue is that [] character still on the interface "match" variable. But when I converted it to string, I thought it would go away. Do you agree I need to replace the [] with no characters here?

Original data from appliance, dictionary:defaultdict(<class 'list'>, {'PSE2': ['0/7/CPU0', '1/0/CPU0', '1/2/CPU0']})
Printing original interface value=['0/5']
type of values v <class 'str'> ['0/7/CPU0', '1/0/CPU0', '1/2/CPU0'] and type of interface:<class 'str'> ['0/5']
Now printing manually assigned value to match interface: 0/7
**** FINALLY FOUND IT ****
Original data from appliance, dictionary:defaultdict(<class 'list'>, {'PSE2': ['0/7/CPU0', '1/0/CPU0', '1/2/CPU0']})
Printing original interface value=['0/7']
type of values v <class 'str'> ['0/7/CPU0', '1/0/CPU0', '1/2/CPU0'] and type of interface:<class 'str'> ['0/7']
Now printing manually assigned value to match interface: 0/7
**** FINALLY FOUND IT ****
exit...

I see we replied at the same time.
Sure I understand the problem now.
I no longer convert the dictionary values 'v' into a string.

Then it is obvious the interface value 'match' is still showing:
Printing original interface value=['0/7']

So can you tell me again your thoughts if it is needed to write a function to replace [] with no character at all?


RE: Error 'object has no attribute' when iterating thru a dictionary - mrapple2020 - Apr-08-2019

Now I am getting index = [0]. I did:
for k, v in arch_dic.items():
                           match = str(match)
                           match = match.strip("[]")
                           match = match.strip("''")
                           print([index for index, value in enumerate(v) if match in value])