Получить основной ключ, используя часть значения в словаре в python - PullRequest
1 голос
/ 28 января 2020

У меня есть словарь, в котором есть подразделы и значения. Я хочу напечатать список основных ключей, которые содержат определенное значение в подразделе. Я надеюсь, что пример проясняет:

cssStyleDict= {'.c13':{'color':'#000',
               'font-family':'"Arial"',
               'font-weight':'700',
               'vertical-align':'baseline'},
               '.c6':{'font-weight':'700'}, 
               '.c7':{'color':'#000',
               'font-size':'11pt',
               'font-weight':'700',
               'text-decoration':'none'},
               '.c2':{'background-color':'#ff0'}}

Я хочу напечатать список всех ключей, которые содержат {'font-weight':'700'}. Я пробовал это:

def getKeysByValue(dictOfElements, valueToFind):
    listOfKeys = list()
    listOfItems = dictOfElements.items()
    for item  in listOfItems:
        if item[1] == valueToFind:
            listOfKeys.append(item[0])
    return  listOfKeys

listOfKeys = getKeysByValue(cssStyleDict, {'font-weight':'700'} )
for key in listOfKeys:
    print(key)

Но, конечно, это только дает мне точное совпадение. Я также пытался использовать выражение регулярных выражений, но безрезультатно. На выходе должен быть список, содержащий .c13 .c6 .c7

Заранее спасибо, если кто-нибудь может помочь.

Ответы [ 4 ]

2 голосов
/ 28 января 2020

Чтобы использовать код, который вы опубликовали в качестве основы для вашего ответа, вам нужно только изменить условие оператора if. В настоящее время вы проверяете идеальное совпадение, потому что вы использовали «==«

. Однако Python поставляется с отличным оператором, который делает именно то, что вам нужно: «в».

Таким образом, ваше новое условие должно быть:

        If valueToFind in item[1]:

Надеюсь, это имеет смысл!

2 голосов
/ 28 января 2020

Вы можете попробовать это так:

>>> [ i for i in cssStyleDict if cssStyleDict[i].get('font-weight') == '700' ]
['.c13', '.c6', '.c7']
0 голосов
/ 28 января 2020

Я бы сделал это, сначала проверив каждый dict для этого ключа, а затем сравнив значение с ожидаемым.

def getKeysByValue(dictOfElements, valueToFind):
    listOfKeys = list()
    listOfItems = dictOfElements.items()
    for k,v in listOfItems:
        try:
            if v[valueToFind[0]] == valueToFind[1]:
                listOfKeys.append(k)
        except KeyError:
            pass
    return  listOfKeys

listOfKeys = getKeysByValue(cssStyleDict, ('font-weight', '700') )
for key in listOfKeys:
    print(key)
0 голосов
/ 28 января 2020

Чистый и прозрачный подход с использованием диктонарных встроенных элементов.

cssStyleDict= {'.c13':{'color':'#000',
               'font-family':'"Arial"',
               'font-weight':'700',
               'vertical-align':'baseline'},
               '.c6':{'font-weight':'700'}, 
               '.c7':{'color':'#000',
               'font-size':'11pt',
               'font-weight':'700',
               'text-decoration':'none'},
               '.c2':{'background-color':'#ff0'}}

for key, val in cssStyleDict.items():
  if(cssStyleDict[key].__contains__('font-weight')):
    if(cssStyleDict[key]['font-weight'] == '700'):
      print(key)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...