Фильтровать словарь, чтобы вернуть определенные ключи - PullRequest
1 голос
/ 01 июля 2019

Я пытался посмотреть на другие вопросы и не нашел ответа, который в достаточной степени решает мою проблему.У меня есть список, если словари содержат много ключей, и я хочу вернуть список словарей, которые содержат только три из этих ключей.

dict_keys(['dropoff_datetime', 'dropoff_latitude', 'dropoff_longitude', 'fare_amount', 'imp_surcharge', 'mta_tax', 'passenger_count', 'payment_type', 'pickup_datetime', 'pickup_latitude', 'pickup_longitude', 'rate_code', 'tip_amount', 'tolls_amount', 'total_amount', 'trip_distance', 'vendor_id'])

Я пишу функцию parse_trips (trips), которая возвращает списокпоездки только со следующими атрибутами:

trip_distance
pickup_latitude
pickup_longitude

Я пробовал так много итераций этого, и был бы рад использовать карту или фильтр, из которых я попробовал много вариантов безуспешно.

def parse_trips(trips):
new_list = []
for trip in trips:
    return trips['trip_distance'], trips['pickup_latidude'], trips['pickup_longitude']

parsed_trips = parse_trips(trips)
parsed_trips and parsed_trips[0]

Это вывод, который я пытаюсь получить

# {'pickup_latitude': '40.64499',
#  'pickup_longitude': '-73.78115',
#  'trip_distance': '18.38'}

Ответы [ 3 ]

2 голосов
/ 01 июля 2019

Вы можете создать словарь с необходимыми ключами и их соответствующими значениями с помощью словарного понимания и добавить его к new_list

#List of keys you need
needed_keys = ['trip_distance', 'pickup_latitude', 'pickup_longitude']

#Iterate over trips list
for trip in trips:

    #Create a dictionary with needed keys and their respective values and add it to result
    new_list.append({k:trip[k] for k in needed_keys})
0 голосов
/ 01 июля 2019
needed_keys = ['trip_distance', 'pickup_latitude', 'pickup_longitude']

for d in dicts:
    for k in [ key for key in d.keys() if not key in needed_keys ]:
        d.pop( k, None )

MWE

keys = ['dropoff_datetime', 'dropoff_latitude', 'dropoff_longitude', 'fare_amount', 'imp_surcharge', 'mta_tax', 'passenger_count', 'payment_type', 'pickup_datetime', 'pickup_latitude', 'pickup_longitude', 'rate_code', 'tip_amount', 'tolls_amount', 'total_amount', 'trip_distance', 'vendor_id']
needed_keys = ['trip_distance', 'pickup_latitude', 'pickup_longitude']

dicts = []
for i in range(10):
    dicts.append( { i:iii for iii,i in enumerate(keys) } )

for d in dicts:
    for key in [ key for key in d.keys() if not key in needed_keys ]:
        d.pop( key, None )
0 голосов
/ 01 июля 2019

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

И тогда вы продолжаете только эти поездки.

После этого вы можете получить доступ к любым полям из ваших проанализированных поездок.

needed_keys = ['trip_distance', 'pickup_latitude', 'pickup_longitude']
parsed_trips = [trip for trip in trips if all(key in trip for key in needed_keys)]

Если вы хотите вернуть только эти 3 ключа из вашего окончательного списка, вы можете вытащить их с помощью:

parsed_trips = [{k: trip[k] for k in needed_keys} for trip in trips if all(key in trip for key in needed_keys)]

Хотя я думаю, что понимание списков / диктов там начинает получатьнемного длинным и уродливым, так что вы можете вместо этого переключиться на традиционный цикл for.

В качестве примечания, вы всегда можете пропустить любые поездки, где trip.get('target_field') is None, потому что .get() выиграл 'выдает ошибку индекса, поскольку по умолчанию возвращается None, если ключ не существует.

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