在python字典中的列表中的字典之间进行迭代-根据条件返回值

时间:2018-10-18 12:18:54

标签: python datetime dictionary

我想抓取天气预报数据,更准确地说,我想从具有多词列表的字典中获取数据:

  data = {'city': BERLIN,
 'list': [{'date': '2018-10-19 18:00:00',
       'weather': {'temp': 12.86,
                'temp_max': 13.98,
                'temp_min': 12.86},
       'wind': {'deg': 64.5011, 'speed': 1.32}},
      {'date': '2018-10-20 18:00:00',
       'weather': {'temp': 15.86,
                'temp_max': 18.48,
                'temp_min': 12.84},,
       'wind': {'deg': 144.507, 'speed': 1.92}},
    ....

棘手的部分是我希望它返回字典中的“ wind”键,其中日期等于SATURDAY。

最后,我想做些类似的事情: {星期六,“风”:{“度”:144.507,“速度”:1.92}}

我已经遍历了“列表”,但不知道如何检查日期的星期六:

    for item in data.get('list'):
print(item.get('date'))
print(item.get('wind'))

返回:

    2018-10-20 18:00:00
{'speed': 3.92, 'deg': 294.003}
    2018-10-20 21:00:00
{'speed': 3.57, 'deg': 276.001}

要检索日和风钥匙,我尝试过:

    for item in data.get('list'):
print(item.get(datetime.strptime('date','%Y-%m-%d %H:%M:%S').weekday()))

但是会收到错误消息,“时间数据'日期'与格式'%Y-%m-%d%H:%M:%S”不匹配

4 个答案:

答案 0 :(得分:1)

您只是错误地使用了strptime,现在您要告诉它从字符串"date"中提取日期数据,但是您想要的是从变量{{ 1}}:

item["date"]

您也不需要使用字典的for item in data['list']: print(datetime.strptime(item["date"],'%Y-%m-%d %H:%M:%S').weekday())) 功能,使用方括号表示法会更容易并且更容易接受

答案 1 :(得分:0)

您应使用item['date']而不是文字'date'来引用项目的'date'值。以下内容将返回第一个星期六条目的wind键的子命令:

next((item['wind'] for item in data['list'] if datetime.strptime(item['date'],'%Y-%m-%d %H:%M:%S').weekday() == 5), {})

答案 2 :(得分:0)

您想做三件事

  1. 遍历字典列表。
  2. date转换为工作日。
  3. 检查工作日是否为Saturday

您已经确定了第一步,但是您无需使用get()方法来访问字典中的键。使用方括号也可以。

for item in data['list']: do something


当您处于循环内时,您需要从date键中获取值,然后使用datetime object函数将其转换为datetime.strptime()。现在,您要对值为date的字符串执行此操作。

您正在这样做: datetime.strptime('date','%Y-%m-%d %H:%M:%S')

应该是这样的: datetime.strptime(item['date'],'%Y-%m-%d %H:%M:%S')

date键转换为值之后,可以将其存储在变量中,并使用strftime()方法将其转换为工作日字符串,方法是使用%A进行调用


第三步也是最后一步是检查工作日是否为Saturday。您可以使用IF语句执行此操作。

if week_day == 'Saturday': do something


将这三个步骤结合在一起可能会导致如下所示:

for item in data['list']:  # step 1

    date = datetime.strptime(item['date'],'%Y-%m-%d %H:%M:%S')  # step 2a
    weekday = date.strftime('%A')  # step 2b

    if weekday == 'Saturday':  # step 3
        print(item)

答案 3 :(得分:0)

谢谢您,反义词,尤其是 user347 。我根据您的建议提出以下建议。请注意,由于要获取星期六和星期日以及12点和15点的数据,因此对其进行了扩展。是否有缩短4个if语句的好方法?

    for item in data['list']:  

date = datetime.strptime(item['date'],'%Y-%m-%d %H:%M:%S')  
weekday = date.strftime('%A') 
time = date.strftime('%H')

if weekday == 'Saturday' and time == '12':
    if item['wind']['speed'] >= 6 and item['wind']['deg'] >= 180:
        print('Perfect conditions on Saturday at 12 -  wind with ' + 
              str(round(item['wind']['speed']* 1.943846, 1)) + 
              ' knots' + ' and direction: '+ str(item['wind']['deg']))

if weekday == 'Saturday' and time == '15':
    if item['wind']['speed'] >= 6 and item['wind']['deg'] >= 180:
        print('Perfect conditions on Saturday at 15  - wind with ' + 
              str(round(item['wind']['speed']* 1.943846, 1)) + 
              ' knots' + ' and direction: '+ str(item['wind']['deg']))

if weekday == 'Sunday' and time == '12':
    if item['wind']['speed'] >= 6 and item['wind']['deg'] >= 180:
        print('Perfect conditions on Sunday at 12 - wind with ' + 
              str(round(item['wind']['speed']* 1.943846, 1)) + 
              ' knots' + ' and direction: '+ str(item['wind']['deg']))

if weekday == 'Sunday' and time == '15':
    if item['wind']['speed'] >= 6 and item['wind']['deg'] >= 180:
        print('Perfect conditions on Sunday at 12 - wind with ' + 
              str(round(item['wind']['speed']* 1.943846, 1)) + 
              ' knots' + ' and direction: '+ str(item['wind']['deg']))

返回:

    Perfect conditions on Saturday at 12 - wind with 13.4 knots and direction: 
    306.511
    Perfect conditions on Saturday at 12 - wind with 14.0 knots and direction: 
    306.001