2012-03-14 2 views
0

Есть ли встроенный код, который индексирует список через функцию индекса? Или я должен сделать это:python: индексирование списка как dict

def index(alist, keyExtractor): 
    result = dict() 
    for item in alist: 
     key = keyExtractor(item) 
     if key is not None: 
      result[key] = item 
    return result 

ответ

3

Вы, вероятно, хотите использовать словарь понимание:

>>> import operator 
>>> keyExtractor=operator.itemgetter(1) # for demonstration purposes 

>>> aList = [('a', 'foo'), ('b', 'bar'), ('q', 'quux')] 
>>> d = {keyExtractor(x):x for x in aList} 
>>> if None in d: 
     del d[None] 
>>> d 
{'quux': ('q', 'quux'), 'foo': ('a', 'foo'), 'bar': ('b', 'bar')} 
+0

+1 для ', если keyExtractor (х)'. –

+1

Возможно, вы захотите использовать '... if keyExtractor (x) не None}', чтобы разрешить ключи, чья «правность» - False. – martineau

+0

Исправлено! Более чистый способ сделать это в любом случае, избегать двойного вычисления на keyExtractor – MikeyB

1

Нет, нет встроенной функции, так как случай использования сравнительно редко. Если keyExtractor всегда возвращает действительный ключ, вы можете использовать более короткий dict comprehension:

def index(alist, keyExtractor): 
    return {keyExtractor(item):item for item in alist} 
1

Попробуйте это:

{ keyExtractor(item) : item for item in alist } 

Он доступен в Python 2.7 и Python 3.

Если keyExtractor возвращается None вас может захотеть удалить запись None.

1

В Python 2.7:

{keyExtractor(i): i for i in alist} 

Для старше:

dict((keyExtractor(i), i) for i in alist) 
Смежные вопросы