【问题标题】:Python dictionary check if the values match with other key valuesPython字典检查值是否与其他键值匹配
【发布时间】:2018-09-05 20:10:44
【问题描述】:

我创建了一个 python 字典,其结构如下:-

mydict = {'2018-08' : [32124,4234,23,2323,32423,342342],
          '2018-07' : [13123,23424,2,3,4343,4232,2342],
          '2018-06' : [1231,12,12313,12331,3123131313,434546,232]}

我想检查键 '2018-08' 的值中的任何值是否与其他键的任何值匹配。有没有写这个的捷径?

【问题讨论】:

  • 编辑您的问题,将dict 更改为mydict。使用掩盖内置 python 类型的变量名总是一个坏主意
  • 您自己尝试过吗?你能展示一下你尝试过的东西吗?
  • 匹配是什么意思?所有相同的价值观?一些相同的值?请创建一个具有所需输出的minimal reproducible example

标签: python dictionary


【解决方案1】:

您可以简单地遍历mydict 的预期值,然后为每个值检查它是否存在于字典的任何值中

您可以使用成语if item in list 来检查item 是否存在于列表list

expected_values = mydict['2018-08']
found = False
for expected in expected_values:
  for key in mydict:
    if expected in mydict[key]:
      found = True
      break

考虑到这是一种蛮力算法,它可能不是大型词典的最佳解决方案

【讨论】:

  • 除非列表以某种方式排序(即从最大到最小或按字母顺序)我认为除了暴力破解之外没有其他方法
【解决方案2】:

这个问题很模糊,所以我假设您希望目标月份(例如 2018-08 年)中的值包含在其他月份的某个地方。

与列表迭代相比,测试成员集的速度要快得多。

target = '2018-08'
s = set()
for k, v in mydict.iteritems():
    if k != target:
        s.update(v)
matches = set(mydict[target]) & s

【讨论】:

    【解决方案3】:

    可以使用itertools.chain创建长列表

    import itertools
    for key,value in mydict.items():
        temp_dict = mydict.copy()
        temp_dict.pop(key)
        big_value_list=list(itertools.chain(*temp_dict.values()))
        print(key, set(value) & set(big_value_list))
    

    通过更改您提供的输入进行试运行

    mydict = {'2018-08' : [32124,4234,23,2323,32423,342342],
              '2018-07' : [13123,23424,2,3,4343,4232,2342],
              '2018-06' : [1231,12,12313,12331,3123131313,434546,232,342342,2342]}
    

    输出:

    ('2018-08', set([342342]))
    ('2018-07', set([2342]))
    ('2018-06', set([342342, 2342]))
    

    【讨论】:

      猜你喜欢
      • 2022-09-24
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      • 2010-12-08
      相关资源
      最近更新 更多