Проверьте, присутствует ли значение в соответствующем списке - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь создать цикл for, где я динамически проверяю, существует ли какое-либо значение в соответствующем списке.Я не знаю точно, могу ли я преобразовать строку в списке, или есть ли лучший способ сделать это.

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'}

Ответы [ 4 ]

0 голосов
/ 04 июня 2018

@ anvd , как я понял из вашей проблемы, вы хотите искать наличие значений словаря d внутри списков rating1 & rating2 .

Пожалуйста, прокомментируйте, если я ошибаюсь или приведенное ниже решение не удовлетворит вашу потребность.

Я предложу вам создать 1больше словарь d_lists , который отображает имя списков в исходные объекты списка.

Шаги:

✓ Возьмите каждый ключ (имя списка) с d .

✓ Найдите наличие этого ключа в d_lists .

✓ Возьмите соответствующий объект списка из d_lists .

✓ Найти значение, указанное ключом, в d внутри выбранного списка.

✓ Если элемент найден, остановить итерацию и найти наличие следующего значения в d .

✓ Напечатайте соответствующие сообщения.

Вот ваш измененный код (с небольшими изменениями)

Я показал еще один хороший пример позже, после приведенного ниже примера кода.

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

Вывод:

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

Теперь рассмотрим другой пример.

Еще один большой пример:

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"

Вывод:

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'] 
0 голосов
/ 04 июня 2018
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"

ИЛИ, если вы хотите использовать переменные, используйте vars(), который предоставляет словарь текущего пространства имен, где вы можете использовать имя переменной в качестве ключа.

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"
0 голосов
/ 04 июня 2018

Вы должны использовать словарь для переменного числа переменных.Предполагая, что вы хотите выполнить какую-то проверку, вы можете создать словарь недопустимых элементов.Один из способов сделать это - выполнить итерацию представления 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'}

Другой подход Pythonic заключается в использовании словарного понимания:

bad_items = {k: v for k, v in d.items() if v not in allowed_values[k]}
0 голосов
/ 04 июня 2018

Вы можете использовать другое сопоставление для списков допустимых значений:

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]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...