2017-02-09 2 views
-2

Um eine Funktion zu erstellen, die notwendig sein wird, um später eine andere zu erstellen, arbeite ich mit dict und Schlüsseln. Auf diese Weise habe ich nach Informationen darüber gesucht, wie sie funktionieren. Aber wenn ich dict und if Anweisungen verwenden muss, bleibe ich normalerweise stecken.Suche nach der besten if-Anweisung Struktur

Ich arbeite in einer Funktion, die die Anzahl der Werte in dict zurückgibt, die auch Schlüssel in dict sind. Mein erster Gedanke war, eine for-Schleife zu verwenden, aber ich bleibe im if-Anweisungscode stecken. Es scheint falsch zu sein, aber ich weiß nicht, was sein könnte. Ich habe abgeleitet, dass ich einen In-Operator und die Variablen k und d, und auch eine Indizierung verwenden muss, aber ich weiß nicht, ob ich sie richtig verwende. Jede Hilfe wird nützlich sein. Vielen Dank im Voraus

Dies ist meine aktuellen Fortschritt:

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

Bitte Python-Code richtig einrücken. Andernfalls führen Sie neue Probleme in den Code ein, den die Leute für Sie lesen. – khelwood

Antwort

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

Verwenden Liste Verständnis eine Liste mit True/False zu bauen. Sum behandelt True als 1 und False als 0.

+1

... du hast keine Ahnung, wie nah ich dran war zu schreiben 'def obligatory_list_comprehension_method()': P Upvote, aber es ist definitiv ein sauberer Ansatz. – roganjosh

+0

Danke! Dies sollte für die meisten Fälle definitiv ausreichen. Die Optimierung von Mitgliedschaftstests mit Mengen könnte wahrscheinlich durchgeführt werden, wenn sie wirklich benötigt werden. –

+1

Ja, ich habe mich nie wirklich mit dem Kipppunkt in Bezug auf die Größe beschäftigt, um "set" für diese Art von Ding zu verwenden. Es ist wahrscheinlich nicht so hoch, wie ich es mir vorgestellt habe, aber es ist es hier sicher nicht wert. – roganjosh

1

mit etwas Festhalten wie Ihr aktueller Ansatz, ist es einfacher, nur eine Liste von Wörterbuchschlüssel zu machen und dann die Mitgliedschaft in der Wörterbuch-Werte in dieser Liste überprüfen . Für große Wörterbücher möchten Sie dict_keys = set(d.keys()) für schnellere Suche verwenden.

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

Oh, ich kannte diese Methode nicht. Gibt es eine Methode, um die if-Anweisung mit einem in-Operator und den Variablen k und d zu schreiben, und auch eine Indizierung? Ich meine, ist das möglich? Ich frage mich nur. Danke trotzdem. – hugo

+1

@hugo Ich bin nicht wirklich klar, was Sie fragen, aber Sie können kein Wörterbuch indizieren, weil es [keine feste Reihenfolge] hat (http://stackoverflow.com/questions/15479928/why-is-the-order-) In-Wörterbücher-und-Sätze-beliebig). Wenn Sie der Meinung sind, dass eine dieser Antworten Ihr Problem gelöst hat, denken Sie bitte daran, sie als akzeptiert zu markieren (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) Die Frage ist geschlossen. – roganjosh

Verwandte Themen