我正在编写一个函数 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
答案 0 :(得分:0)
将d = [j[:1]]
更改为d = j[:1]
。
g = list(abs(x - 55) for x in k)
, x
变量d = [j[:1]]
是一个列表。