2017-02-09 2 views
-2

Чтобы создать функцию, которая будет необходима для создания другой, я буду работать с dict и ключами. Таким образом, я искал некоторую информацию о том, как они работают. Но когда я должен использовать инструкции dict и if, я обычно зацикливаюсь.Ищите лучшую структуру сложения if

Я работаю в функции, которая возвращает количество значений в dict, которые также являются ключами в dict. Моя мысль заключалась в том, чтобы использовать цикл for, но я застрял в коде оператора if. Кажется, это неправильно, но я не знаю, что может быть. Я пришел к выводу, что я должен использовать оператор in и переменные k и d, а также индексирование, но я не знаю, правильно ли я их использую. Любая помощь будет полезна. Заранее спасибо

Это мой текущий прогресс:

def count_values_that_are_keys(d): 
'''(dict) -> int 

Return the number of values in d that are also keys in d. 

>>> count_values_that_are_keys({1: 2, 2: 3, 3: 3}) 
3 
>>> count_values_that_are_keys({1: 1}) 
1 
>>> count_values_that_are_keys({1: 2, 2: 3, 3: 0}) 
2 
>>> count_values_that_are_keys({1: 2}) 
0 
''' 

result = 0 
for k in d: 
    if [d in [k]]: # This part it seems wrong cause I don't get what I expect 
     result = result + 1 

return result 
+0

Пожалуйста, введите код Python в соответствии с требованиями. В противном случае вы вводите новые проблемы в код, который люди читают для вас. – khelwood

ответ

1
def count_values_that_are_keys(d): 
    return sum([x in d.keys() for x in d.values()]) 

Использование списка понимание для создания списка с True/False. Sum обрабатывает True как 1 и False как 0.

+1

... вы понятия не имеете, насколько я был близок к написанию 'def obligatory_list_comprehension_method()': P Upvote, хотя это определенно более чистый подход. – roganjosh

+0

Спасибо! В большинстве случаев этого должно быть достаточно. Оптимизация тестов на членство с наборами, возможно, была бы выполнена, если это действительно необходимо. –

+1

Да, я никогда не рассматривал точку опроса с точки зрения размера для использования 'set' для такого рода вещей. Вероятно, это не так высоко, как я себе представляю, но, конечно, не стоит этого. – roganjosh

1

Вставлять с чем-то, как ваш нынешний подход, это проще сделать список ключей словаря, а затем проверить принадлежность словарных значений в этом списке , Для больших словарей вы хотите использовать dict_keys = set(d.keys()) для более быстрого поиска.

def count_values_that_are_keys(d): 
    '''(dict) -> int 

    Return the number of values in d that are also keys in d. 

    >>> count_values_that_are_keys({1: 2, 2: 3, 3: 3}) 
    3 
    >>> count_values_that_are_keys({1: 1}) 
    1 
    >>> count_values_that_are_keys({1: 2, 2: 3, 3: 0}) 
    2 
    >>> count_values_that_are_keys({1: 2}) 
    0 
    ''' 

    dict_keys = d.keys()  

    result = 0 
    for key, value in d.items(): 
     if value in dict_keys: 
      result += 1 

    return result 

print(count_values_that_are_keys({1: 2, 2: 3, 3: 3})) 
print(count_values_that_are_keys({1: 1})) 
print(count_values_that_are_keys({1: 2, 2: 3, 3: 0})) 
print(count_values_that_are_keys({1: 2})) 
+0

О, я не знал этого метода. Есть ли какой-либо метод для записи оператора if с помощью оператора in и переменных k и d, а также индексации? Я имею в виду, это возможно? Просто интересуюсь. Спасибо, в любом случае. – hugo

+1

@hugo Я не совсем понимаю, что вы просите, но вы не можете индексировать словарь, потому что он имеет [фиксированный порядок] (http://stackoverflow.com/questions/15479928/why-is-the-order- в-словарей-и-множества-произвольные). Если вы чувствуете, что любой из этих ответов решил вашу проблему, пожалуйста, рассмотрите [маркировку их как принятых] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work), чтобы вопрос закрыт. – roganjosh

Смежные вопросы