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

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'}
1
CarterB 1 Июл 2019 в 17:54

3 ответа

Лучший ответ

Вы можете создать словарь с необходимыми ключами и их соответствующими значениями через понимание словаря и добавить его в 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})
2
Devesh Kumar Singh 1 Июл 2019 в 15:35

Вы хотите убедиться, что у вас есть все ключи в ваших целевых словарях, чтобы вы могли использовать встроенную функцию 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, если ключ не существует.

0
user3896255user3896255 1 Июл 2019 в 15:20
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
Suuuehgi 1 Июл 2019 в 15:23