Python Forum
Error 'object has no attribute' when iterating thru a dictionary
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Error 'object has no attribute' when iterating thru a dictionary
#1
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'
>>>
Reply
#2
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.
Craig "Ichabod" O'Brien - xenomind.com
I wish you happiness.
Recommended Tutorials: BBCode, functions, classes, text adventures
Reply
#3
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]
Reply
#4
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...
Reply
#5
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.
Reply
#6
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.
Reply
#7
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.
Reply
#8
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?
Reply
#9
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])
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Error: audioio has no attribute 'AudioOut' netwrok 3 592 Oct-22-2023, 05:53 PM
Last Post: netwrok
  AttributeError: '_tkinter.tkapp' object has no attribute 'username' Konstantin23 4 1,530 Aug-04-2023, 12:41 PM
Last Post: Konstantin23
  Need help with 'str' object is not callable error. Fare 4 776 Jul-23-2023, 02:25 PM
Last Post: Fare
  Python: AttributeError: 'PageObject' object has no attribute 'extract_images' Melcu54 2 3,665 Jun-18-2023, 07:47 PM
Last Post: Melcu54
  Object attribute behavior different in 2 scripts db042190 1 685 Jun-14-2023, 12:37 PM
Last Post: deanhystad
  cx_oracle Error - AttributeError: 'function' object has no attribute 'cursor' birajdarmm 1 2,211 Apr-15-2023, 05:17 PM
Last Post: deanhystad
  Pandas AttributeError: 'DataFrame' object has no attribute 'concat' Sameer33 5 5,299 Feb-17-2023, 06:01 PM
Last Post: Sameer33
  WebDriver' object has no attribute 'find_element_by_css_selector rickadams 3 5,776 Sep-19-2022, 06:11 PM
Last Post: Larz60+
  'dict_items' object has no attribute 'sort' Calli 6 4,352 Jul-29-2022, 09:19 PM
Last Post: Gribouillis
  AttributeError: 'numpy.ndarray' object has no attribute 'load' hobbyist 8 6,967 Jul-06-2022, 10:55 AM
Last Post: deanhystad

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020