过滤字典以返回某些键

时间:2019-07-01 14:54:46

标签: python list dictionary key

我一直在尝试查看其他问题,但没有找到足以解决我问题的答案。我有一个包含许多键的字典列表,并且想返回仅包含其中三个键的字典列表。

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

我已经尝试了很多次迭代,并且很乐意使用map或filter,但我尝试了许多尝试都没有成功。

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 个答案:

答案 0 :(得分:2)

您可以通过字典理解来创建具有所需键及其相应值的字典,并将其添加到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})

答案 1 :(得分:0)

您要确保目标字典中具有所有 键,因此您可以使用内置的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不存在。

答案 2 :(得分:0)

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 )