Python:TypeError:不支持的操作数类型 - :' list'和' int'

时间:2017-11-18 23:07:43

标签: python

我正在编写一个函数 delta ,它有两个参数:电话簿的分区和包含电话用户姓氏首字母分布的列表或元组。该函数必须返回电话簿给定分区的增量,以便给出电话用户姓氏首字母的分配。

A  B C  D  E  F G H I J  K L  M  N 0 P Q R  S  T U V W X Y Z
16 4 17 10 15 4 4 6 7 14 9 17 27 6 1 9 0 12 20 8 0 3 4 0 3 4

例如:总共有220个名字,电话公司决定打印4卷。理想情况下,这些卷中的每一个都应包含220 / 4 = 55个名称。一种可能的划分是A-D E-J K-O P-Z,其计数为47,50,60和63。在绝对值中,这些计数将每个卷的理想55个名称中的8,5,5和8个名称分开。我们将这些偏差的总和称为电话簿分区的增量。对于这种划分,delta因此等于26.

我的代码中出现以下错误:

TypeError: unsupported operand type(s) for -: 'list' and 'int'

有谁知道我做错了什么?错误似乎出现在最后一个函数delta()的最后几行。我也试过制作列表元素的整数或列表的字符串,但它仍然不起作用。

def counts(seq):
    '''
    >>> counts('A-D E-J K-O P-Z')
    (4, 6, 5, 11)
    >>> counts('A-G H-O P Q-Z')
    (7, 8, 1, 10)
    >>> counts('A-D E-K L-P Q-Z')
    (4, 7, 5, 10)
    >>> counts('A-D F-K L-P Q-Z')
    Traceback (most recent call last):
    AssertionError: invalid partitioning
    '''
    r = str(seq)

    input_string = r.split(' ')

    q = []
    for dletter in input_string:
        if '-' in dletter:
            q.append(ord(dletter[2]) - ord(dletter[0]) + 1)
        else:
            q.append(1)


    assert sum([x for x in q]) == 26, "invalid partitioning"

    chars = "abcdefghijklmnopqrstuvwxyz"
    chars = chars.upper()
    for char in chars:
        count = r.count(char)
    assert count == 1, "invalid partitioning"

    return (tuple(q))


def delta(seq, names):
    '''
    >>> names = (16, 4, 17, 10, 15, 4, 4, 6, 7, 14, 9, 17, 27, 6, 1, 9, 0, 12, 20, 8, 0, 3, 4, 0, 3, 4)
    >>> delta('A-D E-J K-O P-Z', names)
    26.0
    >>> delta((7, 8, 1, 10), names)
    94.0
    >>> delta('A-D E-K L-P Q-Z', names)
    18.0
    >>> delta(42, names)
    Traceback (most recent call last):
    AssertionError: invalid partitioning
    '''

    r = counts(seq)

    import itertools
    q = list(itertools.accumulate(r))

    j = list()

    for i in q:
        f = sum(names[:i])
        j.append(f)

    s = [t - s for s, t in zip(j, j[1:])]
    d = [j[:1]]

    k = d + s

    g = list(abs(x - 55) for x in k)

    n = float(sum(g))

    return n

1 个答案:

答案 0 :(得分:0)

d = [j[:1]]更改为d = j[:1]

由于g = list(abs(x - 55) for x in k)

x变量d = [j[:1]]是一个列表。