【问题标题】:Compare list with dictionary and output true and false将列表与字典进行比较并输出真假
【发布时间】:2016-03-01 20:26:50
【问题描述】:

我有一个这样的日期列表:

listdates = [datetime.date(2016, 4, 23), datetime.date(2016, 4, 24), datetime.date(2016, 4, 25), datetime.date(2016, 4, 26), datetime.date(2016, 4, 27)]

我有一本日期设置如下的字典:

dictdates = {'S1': [datetime.date(2016, 4, 20), datetime.date(2016, 4, 21), datetime.date(2016, 4, 22), datetime.date(2016, 4, 23), datetime.date(2016, 4, 24), datetime.date(2016, 4, 25), datetime.date(2016, 4, 26), datetime.date(2016, 4, 27), datetime.date(2016, 4, 28), datetime.date(2016, 4, 29)], 'W26': [datetime.date(2016, 4, 20), datetime.date(2016, 4, 21), datetime.date(2016, 4, 22), datetime.date(2016, 4, 23), datetime.date(2016, 4, 24), datetime.date(2016, 4, 25)], 'W24': [datetime.date(2016, 4, 25)]}

我想将列表与字典进行比较,如果列表中的值与字典中的值匹配,则它应该打印不可用。

我有以下工作:

for val in listdates:
   if val in dictdates['S1']:
      print val, 'unavailable'
   else:
      print val, 'available'

这给出了以下输出:

2016-04-23 unavailable
2016-04-24 unavailable
2016-04-25 unavailable
2016-04-26 unavailable
2016-04-27 unavailable

我想要的是遍历字典中的每个列表并输出可用/不可用的键,如下所示:

S1
2016-04-23 unavailable
2016-04-24 unavailable
2016-04-25 unavailable
2016-04-26 unavailable
2016-04-27 unavailable

W26
2016-04-23 unavailable
2016-04-24 unavailable
2016-04-25 unavailable
2016-04-26 unavailable
2016-04-27 unavailable

W24
2016-04-23 available
2016-04-24 available
2016-04-25 unavailable
2016-04-26 available
2016-04-27 available

etc ...

【问题讨论】:

    标签: python list dictionary generator


    【解决方案1】:

    循环遍历该循环内的字典和列表并输出您要查找的信息

    for key, value in dictdates.items():
        print key
        for val in listdates:
           if val in value:
              print val, 'unavailable'
           else:
              print val, 'available'
        print "\n"
    

    【讨论】:

      【解决方案2】:
      import datetime
      
      listdates = [datetime.date(2016, 4, 23), datetime.date(2016, 4, 24), datetime.date(2016, 4, 25), datetime.date(2016, 4, 26), datetime.date(2016, 4, 27)]
      dictdates = {'S1': [datetime.date(2016, 4, 20), datetime.date(2016, 4, 21), datetime.date(2016, 4, 22), datetime.date(2016, 4, 23), datetime.date(2016, 4, 24), datetime.date(2016, 4, 25), datetime.date(2016, 4, 26), datetime.date(2016, 4, 27), datetime.date(2016, 4, 28), datetime.date(2016, 4, 29)], 'W26': [datetime.date(2016, 4, 20), datetime.date(2016, 4, 21), datetime.date(2016, 4, 22), datetime.date(2016, 4, 23), datetime.date(2016, 4, 24), datetime.date(2016, 4, 25)], 'W24': [datetime.date(2016, 4, 25)]}
      
      for key in dictdates:
          print key
          for val in listdates:
              if val in dictdates[key]:
                  print val, 'unavailable'
              else:
                  print val, 'available'
      

      【讨论】:

        【解决方案3】:

        您还需要遍历字典的键:

        for key, dates in dictdates.items():
            print key
            for val in listdates:
               if val in dates:
                  print val, 'unavailable'
               else:
                  print val, 'available'
        

        【讨论】:

        • 小改进:因为这是 Py2,所以使用 .iteritems().viewitems()(后者仅在 2.7 中,但它更接近 Py3 的 .items() 行为)而不是 .items(),在 Py2 中,涉及创建所有对的 list,而不是直接迭代 dict
        【解决方案4】:

        如果我对您的理解正确,只需遍历字典中的所有值以及遍历列表日期即可

        当您遍历字典时,您会遍历键。

        for i in dictdates: # i is the key in the dictionary
            print i
            for val in listdates:
                if val in dictdates[i]:
                    print val, 'available'
                else:
                    print val, 'unavailable'
        

        换句话说,对于字典中的每个键,检查列表日期中的每个日期并将其与键中的值进行比较。

        希望对你有帮助

        【讨论】:

          【解决方案5】:

          现在是 2016 年。不要编写在 python3 中不起作用的代码 :)

          from __future__ import print_function
          import datetime
          
          listdates = [datetime.date(2016, 4, 23), datetime.date(2016, 4, 24), datetime.date(2016, 4, 25), datetime.date(2016, 4, 26), datetime.date(2016, 4, 27)]
          dictdates = {'S1': [datetime.date(2016, 4, 20), datetime.date(2016, 4, 21), datetime.date(2016, 4, 22), datetime.date(2016, 4, 23), datetime.date(2016, 4, 24), datetime.date(2016, 4, 25), datetime.date(2016, 4, 26), datetime.date(2016, 4, 27), datetime.date(2016, 4, 28), datetime.date(2016, 4, 29)], 'W26': [datetime.date(2016, 4, 20), datetime.date(2016, 4, 21), datetime.date(2016, 4, 22), datetime.date(2016, 4, 23), datetime.date(2016, 4, 24), datetime.date(2016, 4, 25)], 'W24': [datetime.date(2016, 4, 25)]}
          
          for kk, vv in dictdates.items():
              print(kk)
              for ii in vv:
                  print("{0}: {1}".format(ii, ('unavailable' if ii in listdates else 'available')))
          

          【讨论】:

            【解决方案6】:

            为了创建结果,我使用嵌套列表推导式,使用内部字典上的 OrderedDict 来保持日期排序。

            sorted(list(set(listdates + dictdates[k])) 创建字典日期与listdates 中的日期之间的并集的有序列表。然后使用它来遍历每个字典条目的值(例如“S1”、“W24”等)并检查日期是否存在。

            from collections import OrderedDict
            
            d2 = {k: OrderedDict((d, 'unavailable' if d in dictdates[k] else 'available') 
                                 for d in  sorted(list(set(listdates + dictdates[k])))) 
                  for k in dictdates}
            >>> d2
            {'S1': OrderedDict([(datetime.date(2016, 4, 20), 'unavailable'),
                          (datetime.date(2016, 4, 21), 'unavailable'),
                          (datetime.date(2016, 4, 22), 'unavailable'),
                          (datetime.date(2016, 4, 23), 'unavailable'),
                          (datetime.date(2016, 4, 24), 'unavailable'),
                          (datetime.date(2016, 4, 25), 'unavailable'),
                          (datetime.date(2016, 4, 26), 'unavailable'),
                          (datetime.date(2016, 4, 27), 'unavailable'),
                          (datetime.date(2016, 4, 28), 'unavailable'),
                          (datetime.date(2016, 4, 29), 'unavailable')]),
             'W24': OrderedDict([(datetime.date(2016, 4, 23), 'available'),
                          (datetime.date(2016, 4, 24), 'available'),
                          (datetime.date(2016, 4, 25), 'unavailable'),
                          (datetime.date(2016, 4, 26), 'available'),
                          (datetime.date(2016, 4, 27), 'available')]),
             'W26': OrderedDict([(datetime.date(2016, 4, 20), 'unavailable'),
                          (datetime.date(2016, 4, 21), 'unavailable'),
                          (datetime.date(2016, 4, 22), 'unavailable'),
                          (datetime.date(2016, 4, 23), 'unavailable'),
                          (datetime.date(2016, 4, 24), 'unavailable'),
                          (datetime.date(2016, 4, 25), 'unavailable'),
                          (datetime.date(2016, 4, 26), 'available'),
                          (datetime.date(2016, 4, 27), 'available')])}
            

            打印结果:

            for k, dates in d2.iteritems():
                print(k)
                for d in dates.iteritems():
                    print("{0}: {1}".format(d[0].strftime("%Y-%m-%d"), d[1]))
            W26
            2016-04-20: unavailable
            2016-04-21: unavailable
            2016-04-22: unavailable
            2016-04-23: unavailable
            2016-04-24: unavailable
            2016-04-25: unavailable
            2016-04-26: available
            2016-04-27: available
            S1
            2016-04-20: unavailable
            2016-04-21: unavailable
            2016-04-22: unavailable
            2016-04-23: unavailable
            2016-04-24: unavailable
            2016-04-25: unavailable
            2016-04-26: unavailable
            2016-04-27: unavailable
            2016-04-28: unavailable
            2016-04-29: unavailable
            W24
            2016-04-23: available
            2016-04-24: available
            2016-04-25: unavailable
            2016-04-26: available
            2016-04-27: available
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-11-07
              • 1970-01-01
              • 1970-01-01
              • 2017-06-21
              • 1970-01-01
              • 2021-04-21
              • 1970-01-01
              相关资源
              最近更新 更多