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
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? 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])
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]) 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 shows that match was assigned as list instead of a stringto 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]) |