解析DynamoDB返回结果时遇list indices类型错误求助
你遇到的list indices must be integers or slices, not str错误,核心出在get_males函数的分页逻辑里,同时还有一处索引使用错误,具体如下:
1. 分页数据添加方式错误
DynamoDB的query接口返回的response['Items']本身是一个包含多个item字典的列表,你用items.append(response['Items'])会把整个列表作为单个元素塞进主列表items中,最终items会变成[item1, item2, [item3, item4], ...]的嵌套结构。后续遍历的时候,当循环到嵌套的列表元素时,valid_male_adult(adult)里的adult是列表,用adult['age']自然会触发“列表不能用字符串当索引”的错误。
修复方式:把items.append(response['Items'])改成items.extend(response['Items']),这样会把分页返回的每个item逐个添加到主列表里,保持items的结构统一为[item1, item2, item3, ...]。
2. 分页查询用错索引名
第一次查询用的是gender-index,但循环里的分页查询写成了state-index,这会导致查询失败——因为你的KeyConditionExpression是基于gender字段的,必须和索引名匹配,分页时要保持使用gender-index。
3. 潜在的索引越界问题
最后一行json.dumps(list_of_adults[1])如果list_of_adults里元素不足2个,会触发索引越界错误,建议先判断列表长度再取值。
修正后的完整代码
def get_males(): """ Searches all males """ response = table.query( IndexName='gender-index', KeyConditionExpression=Key('gender').eq('Male') ) if response['Count'] > 0: items = response['Items'] # 直接用while循环判断,无需额外的if检查 while 'LastEvaluatedKey' in response: response = table.query( ExclusiveStartKey=response['LastEvaluatedKey'], IndexName='gender-index', # 修正为正确的索引名 KeyConditionExpression=Key('gender').eq('Male') ) items.extend(response['Items']) # 用extend替代append return items else: logger.info('No males found') return [] def valid_male_adult(payload): return payload['age'] > 17 and payload['gender'] == 'Male' if __name__ == "__main__": list_of_adults = [] adults = get_males() for adult in adults: if valid_male_adult(adult): list_of_adults.append(adult) # 先判断列表长度,避免索引越界 if len(list_of_adults) >= 2: json.dumps(list_of_adults[1], cls=DecimalEncoder) else: print("No enough adult males found")
内容的提问来源于stack exchange,提问作者Helen Helen

