Итерация по словарям в списке в словаре в Python - возвращает значения в зависимости от условия - PullRequest
0 голосов
/ 18 октября 2018

Я хочу очистить данные прогноза погоды, точнее, я хочу получить данные из дикта, который имеет список с несколькими диктовками:

  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}},
    ....

Сложность в том, что я хочу, чтобы он возвращал'ветер' ключ в словаре, где дата равна субботе.

В конце я хотел бы получить что-то вроде: {суббота, ветер ': {' град ': 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 голосов
/ 18 октября 2018

Спасибо антивещество , и особенно 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
0 голосов
/ 18 октября 2018

Вы должны использовать 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), {})
0 голосов
/ 18 октября 2018

Вы хотите сделать три вещи.

  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)
0 голосов
/ 18 октября 2018

у вас просто неправильное использование strptime, сейчас вы говорите ему извлечь данные даты из строки "date", но вы хотите извлечь данные даты из переменной item["date"]:

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

вам также не нужно использовать функцию .get() словарей, гораздо проще и удобнее использовать обозначение в квадратных скобках

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...