Python将字典列表与循环中的另一本字典进行比较

时间:2019-05-29 08:10:28

标签: python list loops dictionary

如果字典列表中存在输入,我正在处理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'}]

这里的问题是“无价值”正在打印。 在我的用例中,根本不应该打印任何值。

我经历过Searching array reports "not found" even though it's foundhttps://docs.python.org/3/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops

我不确定为什么打印“无价值”。我正在寻找一种避免在字典列表中存在所有输入的情况下执行else块的方法。 请帮忙。

4 个答案:

答案 0 :(得分:0)

您需要反转循环顺序。

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)

这对我有用,并且不会显示“无价值”

答案 1 :(得分:0)

for允许在迭代完成后使用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')

答案 2 :(得分:0)

我把婴儿带洗澡水丢了吗?

a = {**a, **b}

在Python 3.5或更高版本中,此代码(用于循环)可以简化为:

const someAPICall = (action) => { return axios.put(`some/path/to/api`, data, { withCredentials: true, validateStatus: (status) => { return (status == 200 || status === 403); } }); };

答案 3 :(得分:0)

同意@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)
相关问题