Встроенная обработка ошибок / исключений в Python - PullRequest
2 голосов
/ 11 февраля 2012

Итак, у меня есть 3 списка следующим образом:

list_1 = ['a','b','c'] 
list_2 = ['b','c']
list_3 = [5,4]

Я хочу создать четвертый список значений из list_2 & list_3, который будет отображаться в list_1. list_2 и list_3 не зависят от list_1, но являются подмножествами list_1 и соответствуют друг другу. то есть в list_2 и list_3 отсутствует элемент 'a' и соответствующие значения.

Я хочу обработать пропущенные значения и назначить какое-либо значение, т.е. 0 или пустую строку. Я хотел бы сделать это с помощью встроенной функции. до сих пор я пробовал следующее, но это не удается. Что я делаю не так?

list_4 =[lambda i:list_3[list_2.index(list_1[i])] except "" for i in range(len(list_1))]

Мой конечный результат должен выглядеть так:

list_4=[0,5,4]

Ответы [ 4 ]

2 голосов
/ 11 февраля 2012

Более эффективный способ сделать то, что вы хотите:

dict_2_to_3 = dict(zip(list_2, list_3))
list_4 = [dict_2_to_3.get(i, 0) for i in list_1]
  • Дикт намного более эффективен для поиска
  • Функция .get() позволяет указать значение по умолчанию, если что-то не найдено.
2 голосов
/ 11 февраля 2012

Вы не можете встроить "кроме", как это; они приходят только в попытках / исключая пары, и это нельзя сделать в лямбде.

Если это не домашнее задание или головоломка, я бы вместо этого использовал словарь:

>>> list_1 = ['a','b','c'] 
>>> list_2 = ['b','c']
>>> list_3 = [5,4]
>>> 
>>> mymap = dict(zip(list_2, list_3))
>>> list_4 = [mymap.get(x,0) for x in list_1]
>>> list_4
[0, 5, 4]

Почтовый индекс объединяет два списка в пары:

>>> zip(list_2, list_3)
[('b', 5), ('c', 4)]

Из этого дикта получается словарь (ассоциативный массив):

>>> mymap = dict(zip(list_2, list_3))
>>> mymap
{'c': 4, 'b': 5}
>>> mymap['c']
4
>>> mymap['b']
5

и метод .get(a,b) в словаре означает «найти ключ a и вернуть это значение, но если ключ не найден, вернуть b.»

>>> mymap.get("c", 0)
4
>>> mymap.get("nope", 0)
0
2 голосов
/ 11 февраля 2012

Почему бы вам не проверить наличие значения вместо того, чтобы полагаться на обработку исключений?

list_4 = [(list_3[list_2.index(item)] if item in list_2 else 0) for index,item in enumerate(list_1)]
1 голос
/ 11 февраля 2012

В зависимости от того, какую версию Python вы используете, list.enumerate () может быть еще не включен.enumerate все еще будет существовать как встроенный и будет возвращать кортежи (index, item).Итак, строка, которую вы ищете:

list_4 = [(list_3[list_2.index(item)] if item in list_2 else 0) for index,item in enumerate(list_1)]
...