Python сравнивает список словарей с другим словарем в цикле - PullRequest
1 голос
/ 29 мая 2019

Я работаю над кодом Python для обновления списка словарей, если в списке словарей есть входные данные. Если ввод не существует в списке словарей, он должен вывести «значение не существует во всем списке» или выполнить какую-либо другую операцию. Ниже приведен код, который я написал

a = [{'main_color': 'red', 'second_color': 'blue'},
 {'main_color': 'yellow', 'second_color': 'green'},
 {'main_color': 'blue', 'second_color': 'blue1'}]

conType = input('Enter main color: ')
color=input('Enter secondary color :')

conType1= input('Enter another main color: ')
color1=input('Enter another secondary color: ')

valueDict={}

if conType:
    valueDict[conType]=color

if conType1:
    valueDict[conType1]=color1

print(valueDict)

for d in a:

    for i,j in valueDict.items():

        if d['main_color'] == i:

            print('matched')

            d['second_color'] = j
            break
    else:

        print('no value')

print(a)

Ниже приведен вывод, когда я пытался выполнить вышеуказанный код

Enter main color: red

Enter secondary color :black

Enter another main color: yellow

Enter another secondary color: white

{'red': 'black', 'yellow': 'white'}

matched

matched

no value

[{'main_color': 'red', 'second_color': 'black'}, {'main_color': 'yellow', 'second_color': 'white'}, {'main_color': 'blue', 'second_color': 'blue1'}]

Проблема здесь в том, что «нет значения» печатается. В моем случае никакое значение не должно быть напечатано вообще.

Я прошел через Поиск отчетов массива "не найден", хотя он найден и https://docs.python.org/3/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops

Я не уверен, почему печатается «нет значения». Я ищу способ избежать выполнения блока else, если все входы присутствуют в списке словарей. Пожалуйста, помогите.

Ответы [ 4 ]

0 голосов
/ 29 мая 2019

Согласитесь с @Alexander, но вам также нужна переменная для подсчета цвета в списке.с помощью счетчика вы можете восстановить свой массив, если в списке есть дубликаты

a = {'red': 'blue', 'yellow': 'green', 'blue': 'blue1'}
# in case like a = [{'main_color': 'red', 'second_color': 'blue'},
# {'main_color': 'red', 'second_color': 'blue'}]
a_count = {'red': 1, 'yellow':1, 'blue': 1}
b = {'red': 'black', 'yellow': 'white'}

for i, j in b.items():
    if i in a:
        a[i] = j
print(a)
0 голосов
/ 29 мая 2019

для разрешения использовать команду else для использования после завершения итерации. вы получаете no value из-за этого.

что вам нужно сделать, это сохранить флаг для захвата, если произошел мачед или нет

пример

for d in a:
    flag = False
    for i,j in valueDict.items():
        if d['main_color'] == i:
            print('matched')
            d['second_color'] = j
            flag = True
            # enter code here
            break
    if flag is False:
            print('no value')
0 голосов
/ 29 мая 2019

Я выбросил ребенка с водой из ванны?

a = {'red': 'blue', 'yellow': 'green', 'blue': 'blue1'}
b = {'red': 'black', 'yellow': 'white'}

for i, j in b.items():
    if i in a:
        a[i] = j
print(a)

В Python 3.5 или выше этот код (для цикла) может быть уменьшен до:

a = {**a, **b}

0 голосов
/ 29 мая 2019

вам нужно изменить порядок ваших петель.

a = [{'main_color': 'red', 'second_color': 'blue'},
 {'main_color': 'yellow', 'second_color': 'green'},
 {'main_color': 'blue', 'second_color': 'blue1'}]

conType = input('Enter main color: ')
color=input('Enter secondary color :')

conType1= input('Enter another main color: ')
color1=input('Enter another secondary color: ')

valueDict={}

if conType:
    valueDict[conType]=color

if conType1:
    valueDict[conType1]=color1

print(valueDict)


for i,j in valueDict.items():

    for d in a:

        if d['main_color'] == i:

            print('matched')

            d['second_color'] = j

            break
    else:

        print('no value')

print(a)

Это работает для меня и не выводит 'no value'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...