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.)
1 2 3 4 5 6 7 8 9 10 11 12 |
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)
result = v.find(interface)
|
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
1 2 3 4 5 6 7 8 |
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 ([index for index, value in enumerate (v) if interface in value])
|
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?
1 2 3 4 5 6 7 8 9 |
match = '[0/7]'
if match:
for k, v in arch_dic.items():
print ( f 'Interface:{match} CPU list:{v}' )
if match in v:
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.)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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?
1 2 3 4 5 6 7 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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
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:
1 2 3 4 5 |
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])
|
|