Posts: 25
Threads: 11
Joined: Apr 2019
Apr-07-2019, 06:25 PM
(This post was last modified: Apr-07-2019, 06:25 PM by mrapple2020.)
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'
>>>
Posts: 4,220
Threads: 97
Joined: Sep 2016
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.
Posts: 2,168
Threads: 35
Joined: Sep 2016
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]
Posts: 25
Threads: 11
Joined: Apr 2019
Apr-07-2019, 09:52 PM
(This post was last modified: Apr-07-2019, 10:08 PM by mrapple2020.)
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...
Posts: 2,168
Threads: 35
Joined: Sep 2016
Apr-07-2019, 09:59 PM
(This post was last modified: Apr-07-2019, 10:05 PM by Yoriz.)
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.
Posts: 25
Threads: 11
Joined: Apr 2019
Apr-07-2019, 11:10 PM
(This post was last modified: Apr-07-2019, 11:29 PM by Yoriz.)
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.
Posts: 2,168
Threads: 35
Joined: Sep 2016
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.
Posts: 25
Threads: 11
Joined: Apr 2019
Apr-07-2019, 11:31 PM
(This post was last modified: Apr-07-2019, 11:44 PM by mrapple2020.)
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?
Posts: 25
Threads: 11
Joined: Apr 2019
Apr-08-2019, 01:36 AM
(This post was last modified: Apr-08-2019, 01:36 AM by mrapple2020.)
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])
|