Находить элемент списка, когда список находится в словаре? - PullRequest
5 голосов
/ 03 апреля 2011

Это домашняя работа, поэтому я не ожидаю ответа, просто точка в правильном направлении.

В python у меня есть словарь, который выглядит примерно так:

{'bike101': ('Road Bike',
             [('WH139', 2),
              ('TR102', 2),
              ('TU177', 2),
              ('FR101', 1),
              ('FB101', 1),
              ('BB101', 1),
              ('GS101', 1)]),
 'bike201': ('Mountain Bike',
             [('WH239', 2),
              ('TR202', 2),
              ('TU277', 2),
              ('FR201', 1),
              ('FB201', 1),
              ('BB201', 1),
              ('GS201', 1)]),
 'bike301': ('Racing Bike',
             [('WH339', 2),
              ('TR302', 2),
              ('TU377', 2),
              ('FR301', 1),
              ('FB301', 1),
              ('BB301', 1),
              ('GS301', 1)])}

Например, «Racing Bike» - это название продукта, а список пар (часть, требуемая сумма) соответственно.

Мне нужно написать функцию, которая в качестве аргумента будет содержать приведенный выше словарь и название продукта.затем вернет ключ для него и вернет «Нет», если название продукта не существует.

Я использовал:

    return [key for key, value in product_dict.iteritems() if list(value)[0] == string]

И это вернуло правильный ключ при тестировании, но я не знаюне знаю, как заставить его возвращать 'none', если название продукта не существует, и я не уверен, что это лучший способ сделать это. '

Я могу использовать только встроенные функции в python,любая помощь очень ценится!

Ответы [ 4 ]

2 голосов
/ 03 апреля 2011

Использование понимания списка, пожалуй, не самый очевидный способ, поскольку вы не строите список, а ищете один элемент. Ваш код возвращает не ключ, а список размера 1, если ключ найден, или список размера 0, если его не существует.

Один из способов использовать это в своих интересах - получить доступ к первому элементу ([0]) вашего списка. Тогда вы получите IndexError, если список пуст. Окружите понимание списка с помощью try/except и верните None, если IndexError поднято.

2 голосов
/ 03 апреля 2011

Поскольку вы запрашиваете подсказки, я не буду публиковать рабочий код.

Ваш код является списком, поэтому он выводит список.Если результата нет, список будет пустым.Вы можете связать список с переменной, используйте len(), чтобы проверить его длину, и верните None, если он равен 0.

1 голос
/ 03 апреля 2011

Понимание списка - для построения списка; что вы действительно хотите здесь, это найти данные. Это сразу предлагает словарь, но в этой ситуации самым простым способом было бы использовать циклы, чтобы просто просмотреть данные и попытаться сопоставить название продукта.

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

# Restructure the dictionary
def invert_dictionary(input):
    out={}
    for bike_number in input.keys():                
        product_name, list_of_parts = input[bike_number]
        if not out.has_key(product_name):
            out[product_name]=[]        
        out[product_name].append((bike_number, list_of_parts))
    return out

new_dict = invert_dictionary(d)
# Returns a list of all bikes that are tagged "Racing Bike"
print new_dict['Racing Bike']

Выход:

[('bike301', [('WH339', 2), ('TR302', 2), ('TU377', 2), ('FR301', 1), ('FB301', 1), ('BB301', 1), ('GS301', 1)])]

Изучите, как циклы в этом коде проходят по данным. Вам нужно будет сделать что-то похожее, чтобы найти данные, которые вам нужны в исходном документе.

0 голосов
/ 03 апреля 2011

В одну строку:

product_dict = {'bike301': ('Racing Bike', [('WH339', 2),('TR302', 2),
                                            ('TU377', 2),('FR301', 1),
                                            ('FB301', 1),('BB301', 1),
                                            ('GS301', 1)
                                            ]
                            ),
                'bike201': ('Mountain Bike', [('WH239', 2),('TR202', 2),
                                              ('TU277', 2),('FR201', 1),
                                              ('FB201', 1),('BB201', 1),
                                              ('GS201', 1)
                                              ]
                            ),
                'bike101': ('Road Bike', [('WH139', 2),('TR102', 2),
                                          ('TU177', 2),('FR101', 1),
                                          ('FB101', 1),('BB101', 1),
                                          ('GS101', 1)
                                          ]
                            )
                }


print dict( (string,k) for k,(name,li) in product_dict.iteritems() if name==string).get(string,None)

Не вижу смысла размещать элементы вашего словаря в форме number:(name,a_list)

Я думаю, что лучше определить:

product_dict2 = {('bike301','Racing Bike'):[('WH339', 2),('TR302', 2),
                                            ('TU377', 2),('FR301', 1),
                                            ('FB301', 1),('BB301', 1),
                                            ('GS301', 1)
                                            ],
                 ('bike201','Mountain Bike'):[('WH239', 2),('TR202', 2),
                                              ('TU277', 2),('FR201', 1),
                                              ('FB201', 1),('BB201', 1),
                                              ('GS201', 1)
                                              ],
                 ('bike101','Road Bike'):[('WH139', 2),('TR102', 2),
                                          ('TU177', 2),('FR101', 1),
                                          ('FB101', 1),('BB101', 1),
                                          ('GS101', 1)
                                          ]
                 }

Тогда для ваших нужд вы должны написать:

print dict( (string,numb) for numb,name in product_dict2.iterkeys() if name==string).get(string,None)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...