Mam słownik w Pythonie w ten sposób:

 CS_i = {'C_S1': ['v3', 'v4'], 'C_S3': ['v1'], 'C_S2': ['v2', 'v5']}

I chcę uzyskać dostęp do kluczy przez każdą z ich wartości. Na przykład, chcę uzyskać c_s1 przez v3 . Czy ktoś wie, jak mogę to zrobić?

-1
Amir 2 październik 2017, 08:30

2 odpowiedzi

Najlepsza odpowiedź

Musisz zmierzyć się z dwoma problemami: 1) Wartość, którą odwraca, może wystąpić więcej niż raz, więc będziesz musiał mieć unikalne wartości lub zdecydować, co chcesz zrobić w tej sytuacji i 2) wartość może nie istnieć W słowniku, dzięki czemu chcesz obsługiwać wynik None.

Proste rozwiązanie:

CS_i = {'C_S1': ['v3', 'v4'], 'C_S3': ['v1'], 'C_S2': ['v2', 'v5']}

def getkey(dictionary, value):
    for key, values in dictionary.items():
        if value in values:
            return key

    return None

print(getkey(CS_i, 'v3'))

Jednakże, jeśli wywołasz wystarczająco często getkey(), będziesz chciał rozważyć inverting całego słownika i użyć inwersji zamiast tego:

def invertdict(dictionary):
    inverted = dict()

    for key, values in dictionary.items():
        for value in values:
            inverted[value] = key

    return inverted

CS_i_inverted = invertdict(CS_i)

print(CS_i_inverted['v3'])

Będziesz potrzebować unikalnych wartości, aby działać poprawnie.

0
cdlane 2 październik 2017, 06:16

Zakładając, że słownik może mieć zduplikowane wartości pod wieloma kluczami, można użyć

def vToKeys(dictionary, value): # return keys that dictionary[key] contain value
    return [ key for key, x in dictionary.items() if value in x ]

print(vToKeys(CS_i, 'v3'))

Jeśli po prostu potrzebujesz pierwszego lub tylko dopasowania

def vToKeys(dictionary, value): # return keys that dictionary[key] contain value
    return [ key for key, x in dictionary.items() if value in x ]

print(vToKeys(CS_i, 'v3')[0])
0
professor.jenkins 2 październik 2017, 06:00