Найти индекс частичного словарного элемента в списке - PullRequest
3 голосов
/ 11 ноября 2010

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

myList=[{'id':1,'key1':'a','key2':'b'},{'id':8,'key1':'c','key2':'d'}, 
        {'id':6,'key1':'a','key2':'p'}]

Чтобы найти индекс элемента, я в настоящее время выполняю следующую инструкцию:

print myList.index({'id':8,'key1':'c','key2':'d'})

, которая возвращает 1

Однако я хотел бы сделать что-то вроде этого:

print myList.index({'id':8})

должен вернуть 1

Ответы [ 4 ]

1 голос
/ 12 ноября 2010

Редактировать: Пожалуйста, измените ваш принятый ответ на исправленный ответ @ delnan, который очень похож и, вероятно, работает лучше.

1 голос
/ 11 ноября 2010

Если вы ищете однострочник (в отличие от кода для повторного использования), и ваш размер данных невелик, вы можете сделать что-то вроде:

[elem["id"] for elem in myList].index(8)

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

1 голос
/ 11 ноября 2010

Должно быть относительно простым в реализации. Написанный для Python 3, в Python 2 вы должны использовать .iteritems() (не создает временный список).

def partial_dict_index(dicts, dict_part):
    for i, current_dict in enumerate(dicts):
        # if this dict has all keys required and the values match
        if all(key in current_dict and current_dict[key] == val 
                for key, val in dict_part.items()):
            return i
    raise ValueError("...")

Хотя можно использовать и лучшие имена ...

0 голосов
/ 11 ноября 2010

Вы можете реализовать свой собственный список.Вот пример, который печатает первый найденный результат.Я добавил ValueError, чтобы дублировать существующее поведение .index ().

class DictList(list):

    def index(self, obj):
        for i, o in enumerate(self):
            if o['id'] == obj['id']:
                return i
        else:
            raise ValueError('x not in list')


myList = DictList(({'id':1,'key1':'a','key2':'b'},{'id':8,'key1':'c','key2':'d'}, 
                   {'id':6,'key1':'a','key2':'p'}))

>>> print myList.index({'id': 8})
1

>>> print myList.index({'id': 10})
ValueError: x not in list
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...