我正在从itertools groupby对象构造一个dict理解,为一些字符串构造一个查找字典。
#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
,石斑鱼可迭代或dict comp中的join
调用是否存在问题。
以下内容:
for i,j in lookup:
print(''.join(i),j)
正如预期的那样,没有问题。
必须将值作为列表,将键作为字符串,以避免在每次查找时进行某种转换。
有谁可以指出我在哪里错了?
答案 0 :(得分:1)
当您将标题传递给CREATE EXTENSION IF NOT EXISTS intarray;
CREATE EXTENSION IF NOT EXISTS btree_gist;
alter table match add exclude using gist
(
matchday with =,
(array[home_team_id,foreign_team_id]) with &&
);
短于三个长度时,会发生这种情况:
itemgetter
itemgetter(0, 1, 2)('h')
IndexError: string index out of range
在您理解之前不会发生,因为IndexError
包含lookup
个对象。这些对象是尚未解压缩的生成器。因此,通过在这些对象上调用itertools._grouper
,您试图解压缩它们 - 导致错误。
我认为您应该将list
更改为自定义函数,例如:
key
答案 1 :(得分:0)
这是一个非常有趣的问题。
您收到错误,因为Titles
包含至少1个短于3个字符的元素。
在这种情况下,每个消耗lookup
的attemt都会失败。 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