使用理解列表的python 3的EAN13校验和类

使用理解列表的python 3的EAN13校验和类,python,python-3.x,list-comprehension,map-function,Python,Python 3.x,List Comprehension,Map Function,我试图更改这个Python2类,使其在Python3中工作 但不幸的是,我被困在理解列表中 以下是原始类: class GTIN(object): def __init__(self, barcode=''): self.barcode = barcode def __checkDigit(self, digits): total = sum(digits) + sum(map(lambda d: d*2, digits[-1::-2])) retur

我试图更改这个Python2类,使其在Python3中工作 但不幸的是,我被困在理解列表中

以下是原始类:

class GTIN(object):

def __init__(self, barcode=''):
    self.barcode = barcode

def __checkDigit(self, digits):
        total = sum(digits) + sum(map(lambda d: d*2, digits[-1::-2]))
        return (10 - (total % 10)) % 10

def validateCheckDigit(self, barcode=''):
    barcode = (barcode if barcode else self.barcode)
    if len(barcode) in (8,12,13,14) and barcode.isdigit():
        digits = map(int, barcode)
        checkDigit = self.__checkDigit( digits[0:-1] )
        return checkDigit == digits[-1]
    return False

def addCheckDigit(self, barcode=''):
    barcode = (barcode if barcode else self.barcode)
    if len(barcode) in (7,11,12,13) and barcode.isdigit():
        digits = map(int, barcode)
        return barcode + str(self.__checkDigit(digits))
    return ''
这就是我的noob技能在哪里

class GTIN(object):

def __init__(self, barcode=''):
    self.barcode = barcode

def __checkDigit(self, digits):
        #total = sum(digits) + sum(map(lambda d: d*2, digits[-1::-2]))
        total = sum(digits) + sum([d*2 for d in digits[-1::-2]])
        return (10 - (total % 10)) % 10

def validateCheckDigit(self, barcode=''):
    barcode = (barcode if barcode else self.barcode)
    if len(barcode) in (8,12,13,14) and barcode.isdigit():
        #digits = map(int, barcode)
        digits = (int(s) for s in barcode)
        checkDigit = self.__checkDigit( digits[0:-1] )
        return checkDigit == digits[-1]
    return False

def addCheckDigit(self, barcode=''):
    barcode = (barcode if barcode else self.barcode)
    if len(barcode) in (7,11,12,13) and barcode.isdigit():
        #digits = map(int, barcode)
        digits = (int(s) for s in barcode)
        return barcode + str(self.__checkDigit(digits))
    return ''
我按理解列表更改了所有地图功能,但现在我被这个错误卡住了

TypeError: 'generator' object is not subscriptable
问题在于:

digits = (int(s) for s in barcode)
return barcode + str(self.__checkDigit(digits))
然后,在
\u checkDigit
中,您可以

total = sum(digits) + sum([d*2 for d in digits[-1::-2]])
要使
数字[-1::-2]
起作用,
数字必须是一个列表,或某种其他类型的“可订阅”。在Python3中,
map
返回一个生成器,因此您更改了它。但你把它改成了另一种生成器,一个生成器表达式

您可以使用适当的列表理解(注意方括号):

或者使用
映射
,但将生成器转换为列表:

digits = list(map(int, barcode))

为什么要用列表理解更改
map
的所有应用程序?错误出现在哪里?你知道吗?这是我的错,因为我没有注意到我理解清单上的()!修正了现在附录:在一般情况下,另一种选择可能是使用而不是
[-1::-2]
,但是
islice
不支持开始、停止和步骤的负值。实际上,这是我的错误,我注意到后来我没有很好地使用理解列表,arghhh!!!谢谢你的支持
digits = list(map(int, barcode))