Поиск слова в списке

1

Если у меня есть следующий список предметов для магазина покупок:

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}

Какой самый короткий и эффективный способ сделать это?

Теги:
list
set

4 ответа

3

Если вы намерены искать записи по их '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}
  • 1
    Это очень здравый совет!
0

Вы можете попробовать следующее:

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.

0

Вы можете попробовать выполнить итерацию по списку и просто извлечь файл, соответствующий вашему магазину:

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 если элемент не найден.

0
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}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню