【问题标题】:Python compare list of dictionaries with another dictionary in loopPython将字典列表与循环中的另一个字典进行比较
【发布时间】:2019-05-29 08:10:27
【问题描述】:

如果字典列表中存在输入,我正在编写一个 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 found和https://docs.python.org/3/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops

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

【问题讨论】:

    标签: python list loops dictionary


    【解决方案1】:

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

    【讨论】:

    • 这是错误的。在这种情况下,不会多次打印任何值
    • 当我添加 if flag 为 False 时,此逻辑失败: print('no value') for i,j in valueDict.items(): print(i) 这是多次打印输入。请帮忙
    • 逻辑是正确的,你明白你在那里做了什么吗?为什么这不会多次打印列表,因为您使用了for loop
    • 我明白为什么它会打印多次。用你的逻辑来适应我的用例。但我做不到。输入主色:a 输入辅助色:b 输入另一种主色:c 输入另一种辅助色:d 我尝试使用上述输入值。代码应该只打印一次 a,c。这就是我想要做的。
    • 如果您在 SO 中再次将您的用例作为新问题提出来会更好
    【解决方案2】:

    您需要颠倒循环的顺序。

    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)
    

    这对我有用,不会打印“无价值”

    【讨论】:

    • 不。这仍在打印中
    • 如果字典列表中存在一个输入值而其他输入值不存在,则此逻辑将失败
    • 那是因为你已经这样编码了,添加一个 elif 语句来检查列表中的第二个项目,或者如果你希望两者都匹配,那么在 dict 中编写一个带有 2 个条件子句 AKA 项目 1 的 if 语句和dict中的第2项。然后,如果这些都不匹配,它将转到 else 语句并打印 no value
    【解决方案3】:

    同意@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)
    

    【讨论】:

      【解决方案4】:

      我是不是把婴儿和洗澡水一起倒了出去?

      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 或更高版本中,此代码(for 循环)可以简化为:

      a = {**a, **b}

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-07
        • 1970-01-01
        • 2020-08-07
        相关资源
        最近更新 更多