Обратное нечеткое совпадение в словаре с несколькими критериями - PullRequest
1 голос
/ 21 января 2020

Я пытаюсь сделать обратный нечеткий выбор с несколькими критериями для словаря python, и я не могу его достичь.

У меня есть словарь с информацией о погоде:

{'time': '2020-01-21',
 'summary': 'Rain and dangerously windy throughout the day.',
 'icon': 'rain',
 'sunriseTime': 1579590780,
 'sunsetTime': 1579625640,
 'moonPhase': 0.9,
 'precipIntensity': 4.0669,
 'precipIntensityMax': 6.6666,
 'precipIntensityMaxTime': 1579640520,
 'precipProbability': 1,
 'precipType': 'rain',
 'temperatureHigh': 13.39,
 'temperatureHighTime': 1579608240,
 'temperatureLow': 11.49,
 'temperatureLowTime': 1579645500,
 'apparentTemperatureHigh': 13.11,
 'apparentTemperatureHighTime': 1579608240,
 'apparentTemperatureLow': 11.76,
 'apparentTemperatureLowTime': 1579645500,
 'dewPoint': 9.58,
 'humidity': 0.88,
 'pressure': 1024.8,
 'windSpeed': 14.23,
 'windGust': 23.47,
 'windGustTime': 1579628880,
 'windBearing': 72,
 'cloudCover': 0.99,
 'uvIndex': 1,
 'uvIndexTime': 1579608060,
 'visibility': 6.288,
 'ozone': 406.5,
 'temperatureMin': 8.41,
 'temperatureMinTime': 1579569780,
 'temperatureMax': 13.82,
 'temperatureMaxTime': 1579639560,
 'apparentTemperatureMin': 3.78,
 'apparentTemperatureMinTime': 1579569360,
 'apparentTemperatureMax': 13.54,
 'apparentTemperatureMaxTime': 1579639560}

Я хотел бы удалить все ключи, для которых в тексте указано «Время», «Высокий» или «Низкий».

Следующий код дает мне все ключи, которые я хотел бы удалить:

{k:v for (k,v) in forecast_dict[0].items() for x in ["Time", "High", "Low"] if x in k}

с выводом:

{'sunriseTime': 1579590780,
 'sunsetTime': 1579625640,
 'precipIntensityMaxTime': 1579640520,
 'temperatureHigh': 13.39,
 'temperatureHighTime': 1579608240,
 'temperatureLow': 11.49,
 'temperatureLowTime': 1579645500,
 'apparentTemperatureHigh': 13.11,
 'apparentTemperatureHighTime': 1579608240,
 'apparentTemperatureLow': 11.76,
 'apparentTemperatureLowTime': 1579645500,
 'windGustTime': 1579628880,
 'uvIndexTime': 1579608060,
 'temperatureMinTime': 1579569780,
 'temperatureMaxTime': 1579639560,
 'apparentTemperatureMinTime': 1579569360,
 'apparentTemperatureMaxTime': 1579639560}

Когда я пытаюсь сделать обратный выбор со следующим:

{k:v for (k,v) in forecast_dict[0].items() for x in ["Time", "High", "Low"] if x not in k}

Я получаю весь словарь со всеми записями. Я думаю, что проблема с распаковкой списка, но если это работает для прямой фильтрации, разве это не должно работать для обратной?

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Я бы предложил изменить условие для использования any:

{k:v for k,v in forecast_dict[0].items() 
     if not any(x in k for x in ["Time", "High", "Low"])}
0 голосов
/ 21 января 2020

Это то, что вы ищете? Используя any() и генератор:

>>> {k:v for k, v in forecast_dict[0].items() if not any(x in k for x in["Time", "High", "Low"])}
{'time': '2020-01-21',
 'summary': 'Rain and dangerously windy throughout the day.',
 'icon': 'rain',
 'moonPhase': 0.9,
 'precipIntensity': 4.0669,
 'precipIntensityMax': 6.6666,
 'precipProbability': 1,
 'precipType': 'rain',
 'dewPoint': 9.58,
 'humidity': 0.88,
 'pressure': 1024.8,
 'windSpeed': 14.23,
 'windGust': 23.47,
 'windBearing': 72,
 'cloudCover': 0.99,
 'uvIndex': 1,
 'visibility': 6.288,
 'ozone': 406.5,
 'temperatureMin': 8.41,
 'temperatureMax': 13.82,
 'apparentTemperatureMin': 3.78,
 'apparentTemperatureMax': 13.54}
...