从代码战争中解决任务(“kata”)。 基于我如何解决问题的简洁和简化的描述:
给定两个包含两支球队的比赛结果的列表
和x
(始终 10 场比赛)。y
例如:
x = [1, 2, 3, 4, 2, 1, 1, 2, 2, 3]
y = [0, 0, 0, 0, 1, 3, 4, 3, 4, 4]
每场比赛的积分如下:
- 如果 x > y:3 分(获胜)
- 如果 x < y: 0 points (loss)
- 如果 x = y:1 分(平局)
编写一个函数,返回 (x) 队在比赛中获得的分数 根据上述规则获得冠军。
我用两种方式编写代码。
第一个(使用 zip 功能)- 成功了。 第二个(使用for循环)-不。(简单的比较操作无法正常工作,我可以找出原因!)。代码非常简单(见下文,但计算不正确!)。
即
sum_x[4] == 2
和 sum_y[4] == 1
和 结果应该等于 '3' (x > y => 3),但它得到 '1' - 为什么?!
有两种解决任务方法的代码:
1(工作过):
sum_x = [1, 2, 3, 4, 2, 1, 1, 2, 2, 3]
sum_y = [0, 0, 0, 0, 1, 3, 4, 3, 4, 4]
def sum_xy():
x = []
for k, l in zip(sum_x, sum_y):
if k > l:
x.append(3)
elif k < l:
x.append(0)
else:
x.append(1)
return x, sum(x)
输出:
([3, 3, 3, 3, **3**, 0, 0, 0, 0, 0], 15)
2(不起作用!):
sum_x = [1, 2, 3, 4, 2, 1, 1, 2, 2, 3]
sum_y = [0, 0, 0, 0, 1, 3, 4, 3, 4, 4]
def sum_xy():
x = []
for k in sum_x:
for l in sum_y:
if k > l:
x.append(3)
elif k < l:
x.append(0)
else:
x.append(1)
return x, sum(x)
输出:
([3, 3, 3, 3, **1**, 0, 0, 0, 0, 0], 13)
为什么应该是
1
却有3
? - 这是我的问题。
版本 2 仅将
sum_x
的第一个元素与 sum_y
的每个元素进行比较。然后,它在外循环第一次迭代结束时返回结果。
如果将
return
语句移到末尾,它仍然是错误的,因为它们会比较两个列表的每个元素,而不仅仅是相应的元素。
如果不想使用
zip()
,则需要使用索引来获取对应的元素。
def sum_xy():
x = []
for i, k in enumerate(sum_x):
l = sum_y[i]
if k > l:
x.append(3)
elif k < l:
x.append(0)
else:
x.append(1)
return x, sum(x)