Если у меня есть следующий список предметов для магазина покупок:
shop_list = [{'item': 'apple', 'amount': 10, 'cost': 5},
{'item': 'banana', 'amount': 12, 'cost': 6},
{'item': 'strawberry', 'amount': 8, 'cost': 9}]
Поэтому у меня есть несколько указателей в списке. Я хочу узнать, как получить элемент dict, знающий предмет. Например:
def x(item)
#do something to get the dict
print dict
x('apple') #print {'item': 'apple', 'amount': 10, 'cost': 5}
x('banana') #print {'item': 'banana', 'amount': 12, 'cost': 6}
Какой самый короткий и эффективный способ сделать это?
Если вы намерены искать записи по их 'item'
, тогда вам следует подумать о том, чтобы dict
какие ключи являются 'item'
а не list
dict
.
shop_list = {
'apple': {'amount': 10, 'cost': 5},
'banana': {'amount': 12, 'cost': 6},
'strawberry': {'amount': 8, 'cost': 9}
}
shop_list['banana'] # {'amount': 10, 'cost': 5}
В частности, это делает поиск O (1) вместо O (n), необходимого для прохождения list
.
Если вы не можете обновить код, сгенерированный исходным shop_list
, тогда вы можете преобразовать уже существующие данные с помощью понимания dict.
formatted_shop_list = {product['item']: product for product in shop_list}
Вы можете попробовать следующее:
def x(item):
return [elements for elements in shop_list if elements['item'] == item]
x('apple') #print {'item': 'apple', 'amount': 10, 'cost': 5}
x('banana') #print {'item': 'banana', 'amount': 12, 'cost': 6}
Это вернет элемент списка, если будет найден
[{'amount': 12, 'cost': 6, 'item': 'banana'}]
и если результат не найден, возвращается empty list
.
Вы можете попробовать выполнить итерацию по списку и просто извлечь файл, соответствующий вашему магазину:
def shop_item(shop_list, item):
return next((x for x in shop_list if x['item'] == item), None)
# or next(filter(lambda x: x['item'] == item, shop_list), None)
Что работает следующим образом:
>>> shop_list = [{'item': 'apple', 'amount': 10, 'cost': 5},
... {'item': 'banana', 'amount': 12, 'cost': 6},
... {'item': 'strawberry', 'amount': 8, 'cost': 9}]
>>> shop_item(shop_list, 'apple')
{'item': 'apple', 'amount': 10, 'cost': 5}
>>> shop_item(shop_list, 'grape')
None
Вышеприведенное использует next()
с выражением генератора для итерации по списку, пока условие не будет выполнено, и возвращает None
если элемент не найден.
def x(shop_list, item): # remove first parameter if you want to use global variable
for i in shop_list:
if i['item'] == item:
return i
Затем вы можете вызвать эту функцию как:
>>> todays_shop_list = [{'item': 'apple', 'amount': 10, 'cost': 5},
... {'item': 'banana', 'amount': 12, 'cost': 6},
... {'item': 'strawberry', 'amount': 8, 'cost': 9}]
>>> x(todays_shop_list, 'apple')
{'item': 'apple', 'amount': 10, 'cost': 5}