Ошибка индекса понимания Dict

В настоящее время я создаю понимание dict из объекта itertools groupby, чтобы создать словарь поиска для некоторых строк.

#groupby iterable arranged by first 3 chars of each element of 'Titles' list.
lookup= groupby(sorted(Titles), key=itemgetter(0,1,2))
#key=concatenate the elements of the tuple, val=list of grouper iterable
lookdict={''.join(i):list(j) for i,j in lookup}

Эта вторая строка дает мне IndexError: string index out of range. Я не могу сказать, является ли это проблемой с j, итерируемым группером или вызовом join в dict comp. Следующее:

for i,j in lookup:
    print(''.join(i),j)

Это, как и ожидалось, не проблематично.

Необходимо иметь значения в виде списка и ключи в виде строк, чтобы избежать какого-либо преобразования при каждом поиске.

Может ли кто-нибудь указать, где я ошибаюсь здесь?


person cdDC    schedule 03.04.2018    source источник
comment
ошибка копирования и вставки, исправлено.   -  person cdDC    schedule 03.04.2018
comment
Я запустил ваш код и с Titles = ['123abc', '123456', 'abcdef', 'abc123'] получил lookdict == {'123': ['123456', '123abc'], 'abc': ['abc123', 'abcdef']}. Не могли бы вы опубликовать некоторые примеры данных?   -  person FHTMitchell    schedule 03.04.2018
comment
Кажется, у вас есть элемент с менее чем 3 символами в списке заголовков.   -  person Shivam Singh    schedule 03.04.2018


Ответы (2)


Когда вы передаете в itemgetter заголовок, длина которого меньше трех, происходит следующее:

itemgetter(0, 1, 2)('h')
IndexError: string index out of range

IndexError не произойдет до вашего понимания, потому что lookup содержит itertools._grouper объектов. Эти объекты являются генераторами, которые еще предстоит распаковать. Таким образом, вызывая list для этих объектов, вы пытаетесь их распаковать, что приводит к ошибке.

Я думаю, вам следует изменить key на пользовательскую функцию, например:

def key(item):
    return item[:3]

key('h')  # --> 'h'
key('hello')  # --> 'hel'
person FHTMitchell    schedule 03.04.2018
comment
Спасибо за предложение - person cdDC; 03.04.2018

Это довольно интересный вопрос.

Вы получаете сообщение об ошибке, потому что Titles содержит как минимум 1 элемент короче 3 символов.

Каждая попытка потреблять lookup в этом случае потерпит неудачу. for i, j in lookup, for i in loopup и даже просто list(lookup):

Titles = ['abc', 'asf', 'asf', 'qwer', 'asfgsadfa', 'a']
lookup = groupby(sorted(Titles), key=itemgetter(0, 1, 2))
list(lookup)

Traceback (most recent call last):
 File "main.py", line 5, in <module>
 print(list(lookup))
IndexError: string index out of range
person DeepSpace    schedule 03.04.2018