Можно ли отфильтровать массив для конкретного значения ключа и возвращаемого значения для этого ключа?

У меня есть следующий массив:

[
    {
        "action_type": "landing_page_view",
        "value": "72"
    },
    {
        "action_type": "link_click",
        "value": "6"
    }        
]

Как я могу получить значение для action_type: link_click и вернуть 0, если этот action_type не существует?

Редактировать: я хотел бы избежать больших петель.

0
user866364 1 Май 2019 в 00:02

4 ответа

Лучший ответ

Вы можете использовать функцию next ():

L      = [... your list .... ]
key    = "link_click"
result = next( (d["value"] for d in L if d["action_type"]==key), 0)
1
Alain T. 30 Апр 2019 в 21:18

Да, вы можете использовать понимание списков, чтобы добиться этого:

def filter_function(l):
    result = [ item["value"] for item in l if item["action_type"] == "landing_page_view"]   
    if len(result) > 0:
        return result
    else:
        return 0

l = [
        {
            "action_type": "landing_page_view",
            "value": "72"
        },
        {
            "action_type": "link_click",
            "value": "6"
        }
    ]

print(filter_function(l))
0
Alassane Ndiaye 30 Апр 2019 в 21:11

Конечно, вы можете использовать встроенную функцию фильтра .

Требуется лямбда-функция. В этом случае это было бы что-то вроде

lambda x: x['action_type'] == "link_click"

И преобразовать результат в список:

dt = [{'action_type': 'landing_page_view', 'value': '72'},
      {'action_type': 'link_click', 'value': '6'}]

list (filter (lambda x: x['action_type'] == "link_click", dt))                            
# Returns [{'action_type': 'link_click', 'value': '6'}]

Он вернет пустой список, если ничего не найдено.

После этого вернуть 0, если ничего не найдено, очень просто.

# data - the input data
# key - the key to search
# val - the value to compare with
# key2 - the key whose value should be returned in case of a match
def flt (data, key, val, key2):
    found = list (filter (lambda x: x[key] == val, data))
    if found:
        return found[0][key2]
    return 0

И чтобы сделать его еще более гладким, используйте функцию next, как предложено @ alain-t.

def flt (data, key, val, key2): 
    return next (filter (lambda x: x[key] == val, data), {key2: 0})[key2] 
2
hingev 30 Апр 2019 в 21:33
x=[
    {
        "action_type": "landing_page_view",
        "value": "72"
    },
    {
        "action_type": "link_click",
        "value": "6"
    }        
]

res = list(filter(lambda x: x['action_type']=='link_click',x))
sol = list(map(lambda x:x['value'], res))

if sol==[]: 
    print(0)
else:
     print(sol)



# output ['6']
0
sahasrara62 30 Апр 2019 в 22:24