Проверить членство в списке и одновременно получить индекс в Python - PullRequest
0 голосов
/ 07 октября 2011

Кажется глупым писать следующее:

L = []

if x in L:
  L[x] = something
else:
  L[x] = something_else

Разве это не выполняет поиск x дважды?Я попытался с помощью index (), но это дает ошибку, когда значение не найдено.

В идеале я хотел бы сказать:Спасибо.

Ответы [ 4 ]

2 голосов
/ 07 октября 2011

Другой вариант - попробовать / исключить:

d = {}
try:
    d[x] = something_else
except KeyError:
    d[x] = something

Тот же результат, что и ваш код.

Редактировать: Хорошо, быстро движущаяся цель.Та же идиома для списка, другое исключение (IndexError).

2 голосов
/ 07 октября 2011

Вы хотите сказать, что хотите setdefault(key[, default])

a = {}
a['foo'] # KeyError
a.setdefault('foo', 'bar') # key not exist, set a['foo'] = 'bar'
a.setdefault('foo', 'x') # key exist, return 'bar'
1 голос
/ 07 октября 2011

Если у вас есть список , вы можете использовать index, ловя ValueError, если он брошен:

yourList = []
try:
    i = yourList.index(x)
except ValueError:
    i = None

Затем вы можете проверить значение i:

if i is not None:
    # Do things if the item was found.
0 голосов
/ 07 октября 2011

Я думаю, что ваш вопрос многих смутил, потому что вы смешали синтаксис между dict и list.Если:

L = []  # L is synonym for list and [] (braces) used to create list()

Здесь вы ищете значение в списке, не ключ или значение в диктовке:

if x in L: 

И тогда выиспользуйте x , казалось бы, предназначенный как ключ, но в списках это индекс int (), а выполнение if x in L: не проверяет, находится ли индекс в L, но если значение в L:

L[x]=value

Так что, если вы намереваетесь увидеть, находится ли значение в L, список сделайте:

L = []                # that's a list and empty; and x will NEVER be in an empty list.
if x in L:            # that looks for value in list; not index in list
                      # to test for an index in a list do if len(L)>=x
   idx = L.index(x)
   L[idx] = something   # that makes L[index]=value not L[key]=value
else:
   # x is not in L so you either append it or append something_else
   L.append(x)

Если вы используете: L[x] = something вместе с if x in L:, тогда имеет смысл иметьсписок только с этими значениями: L=[ 0, 1, 2, 3, 4, ...] ИЛИ L=[ 1.0, 2.0, 3.0, ...]

Но я бы предложил это:

L = []
L.extend(my_iterable)
coder0 = 'farr'
coder1 = 'Mark Byers'
if coder0 not in L:
    L.append(coder1)

Странная логика

...