Próbuję utworzyć pętlę, w której kontroluję dynamicznie, jeśli pewna wartość istnieje na odpowiedniej liście. Nie wiem dokładnie, jeśli mogę przekształcić ciąg na liście, lub jeśli jest lepszy sposób na to zrobić.

rating_1 = ['no', 'yes']
rating_2 = ['no', 'yes']

for item in d:
    if d[item] not in item: # I don't want to use the item,
                            # only get name that will match the respective list above
        print "value not allowed"

d =  {'rating_2': u'no', 'rating_1': u'no'}
3
anvd 4 czerwiec 2018, 19:08

4 odpowiedzi

Najlepsza odpowiedź
my_lists = {
'rating_1' = ['no', 'yes'],
'rating_2' = ['no', 'yes'],
}

d =  {'rating_2': u'no', 'rating_1': u'no'}

for item in d:
    if d[item] not in my_list[item]:
        print "value not allowed"

Lub, jeśli chcesz użyć zmiennych, użyj vars() Dostarcza słownika bieżącej przestrzeni nazw, gdzie można użyć nazwy zmiennej jako klucza.

rating_1 = ['no', 'yes']
rating_2 = ['no', 'yes']

d =  {'rating_2': u'no', 'rating_1': u'no'}

for item in d:
    if d[item] not in vars()[item]:
        print "value not allowed"
2
Abhijith Asokan 4 czerwiec 2018, 16:29

@anvd , jak zrozumiałem z twojego problemu, chcesz przeszukać obecność wartości słownika D wewnątrz listy rating1 & amp; ocena2 .

Proszę skomentować, jeśli się mylę lub rozwiązanie, które podane poniżej nie spełniają potrzeby.

Sugeruję, abyś utworzyć 1 więcej słownika D_Listr , który mapuje nazwę list do oryginalnych obiektów listy.

Kroki:

✓ Weź każdy klawisz (nazwa listy) z d .

✓ Znajdź istnienie tego klucza w D_Lists .

✓ Weź odpowiedni obiekt listy z D_Lists .

✓ Znajdź istnienie wartości wskazanego przez klawisz D wewnątrz wybranego listy obiektu.

✓ Jeśli znalazł się element, zatrzymaj iter i wyszukaj obecność następnej wartości w D .

✓ Drukuj odpowiednie wiadomości.

Oto twój zmodyfikowany kod (z małą modyfikacją)

Wykazałem kolejny dobry przykład później po poniższym przykładzie kodu.

rating_1 = ['nlo', 'yes']
rating_2 = ['no', 'yes']

# Creating a dictionary that maps list names to themselves (original list object)
d_lists = {
    "rating_1": rating_1,
    "rating_2": rating_2,
}

# Creating a dictionary that maps list to the item to be searched
# We just want to check whether 'rating_1' & 'rating_2' contains 'no' or not
d =  {'rating_2': u'no', 'rating_1': u'no'}

# Search operation using loop
for list_name in d:
    if list_name in d_lists:
        found = False
        for item in d_lists[list_name]:
            if item == d[list_name]:
                found = True
                break
        if found:
            print "'" + d[list_name] + "' exists in", d_lists[list_name];
        else:
            print "'" + d[list_name] + "' doesn't exist in", d_lists[list_name]
    else:
        print "Couldn't find", list_name

Wynik:

'no' exists in ['no', 'yes']
'no' doesn't exist in ['nlo', 'yes']

Teraz spójrz na inny przykład.

Inny duży przykład:

rating_1 = ['no', 'yes', 'good', 'best']
rating_2 = ['no', 'yes', 'better', 'worst', 'bad']
fruits = ["apple", "mango", "pineapple"]

# Creating a dictionary that maps list names to themselves (original list object)
d_lists = {
    "rating_1": rating_1,
    "rating_2": rating_2,
    "fruits": fruits,
}

# Creating a dictionary that maps list to the item to be searched
# We just want to check whether 'rating_1' & 'rating_2' contains 'no' or not
d =  {'rating_2': u'best', 'rating_1': u'good', 'fruits2': "blackberry"}

# Search operation using loop
for list_name in d:
    if list_name in d_lists:
        print "Found list referred by key/name", list_name, "=", d_lists[list_name];
        found = False
        for item in d_lists[list_name]:
            if d[list_name] == item:
                found = True
                break
        if found:
            print "'" + d[list_name] + "' exists in", d_lists[list_name], "\n";
        else:
            print "'" + d[list_name] + "' doesn't exist in", d_lists[list_name], "\n"
    else:
        print "Couldn't find list referred by key/name ", list_name, "\n"

Wynik:

Found list referred by key/name rating_2 = ['no', 'yes', 'better', 'worst', 'bad']
'best' doesn't exist in ['no', 'yes', 'better', 'worst', 'bad'] 

Couldn't find list referred by key/name  fruits2 

Found list referred by key/name rating_1 = ['no', 'yes', 'good', 'best']
'good' exists in ['no', 'yes', 'good', 'best'] 
-1
hygull 4 czerwiec 2018, 17:41

Powinieneś użyć słownika zmiennej liczby zmiennych. Zakładając, że chcesz wykonać pewne walidację, możesz utworzyć słownik nieprawidłowych elementów. Jednym ze sposobów na to jest poprzez iteriating the view dict.items:

d =  {'rating_2': 'noo', 'rating_1': 'no'}
allowed_values = {'rating_2': ['no', 'yes'], 'rating_1': ['no', 'yes']}

bad_items = {}

for k, v in d.items():  
    if v not in allowed_values[k]:
        bad_items[k] = v

print(bad_items)

{'rating_2': 'noo'}

Kolejne podejście Pythonic jest użycie ze zrozumieniem słownika:

bad_items = {k: v for k, v in d.items() if v not in allowed_values[k]}
1
jpp 4 czerwiec 2018, 16:26

Możesz użyć innego mapowania list dozwolonych wartości:

d =  {'rating_2': 'no', 'rating_1': 'no'}
allowed_values = {'rating_2': ['no', 'yes'], 'rating_1': ['no', 'yes']}

is_valid = all(d[item] in allowed_values[item] for item in d)

invalid_items = {k: v for k, v in d.items() if v not in allowed_values[k]}
1
Jacques Gaudin 4 czerwiec 2018, 16:31