简体   繁体   中英

Inverse fuzzy match on dictionary with multiple criteria

I am trying to do an inverse fuzzy selection with multiple criteria on a python dictionary and I am unable to achieve it.

I have a dictionary with weather info:

{'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}

I would like to remove all keys with either "Time", "High" or "Low" in their text.

The following code gives me all the keys I would like to remove:

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

with output:

{'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}

When I try to do the reverse selection with the following:

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

I get back the whole dictionary with all the entries. I think the problem is with the list unpacking, but if it works for direct filtering, shouldn't it work for reverse?

Is this what you're after? Using any() and a generator:

>>> {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}

I would suggest changing the condition to use any :

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM