这是在线课程作业的一部分,我们被要求为2048游戏构建合并功能。该函数将列表作为参数并迭代它以返回另一个列表,其中合并相同的元素,并更新列表。
到目前为止,我能够检查空瓦片“零”并返回包含其余数字的列表。代码:
def merge(line):
"""
A function that merges a single row or column in 2048.
"""
output = [0]* len(line)
output1 = [0]* len(line)
for num in line:
if num != 0:
output.insert(-1,num)
del output[0]
我陷入困境的下一步是如何评估新列表以合并具有相同值的“sum”项目。
我想将函数扩展为执行此操作的内容:
for num in output:
if num == "the next item in list":
return the sum of both items and skip to the next item
output1.insert(-1, "the sum of the two items")
del output1[0]
我们提供了运行测试以查看我们的代码是否正常运行
[2, 0, 2, 4] should return [4, 4, 0, 0],
[0, 0, 2, 2] should return [4, 0, 0, 0],
[2, 2, 0, 0] should return [4, 0, 0, 0],
[2, 2, 2, 2, 2] should return [4, 4, 2, 0, 0],
[8, 16, 16, 8] should return [8, 32, 8, 0]
非常感谢您的帮助
答案 0 :(得分:1)
我也分两步完成。移动所有数字,删除任何零。然后遍历结合2个相似数字的数字列表。我使用itertools.groupby更容易迭代相似的数字。
groupby
为每组相同的数字返回一个迭代器,所以:
[2,2,0,0]
变为
[(2, [2, 2]), (0, [0, 0])]
这使得将每个相似的组作为单独的块进行处理变得更加容易。
对于类似[2,2]
或[2,2,2]
的相似数字的群组,输出将始终为长度的一半列表,列表中的项目均为2*n
(对于奇数长度)列表中,有一个额外的最后一个元素,只有n
)。
from itertools import groupby
def merge(line):
cnt = len(line)
# Move all numbers left, removing zeros
line = [num for num in line if num != 0]
out = []
# Combine like numbers
for num, niter in groupby(line):
ncnt = len(list(niter))
out.extend([num * 2] * (ncnt // 2))
if ncnt % 2:
out.append(num)
# Right pad the list with zeros to the original line length
out.extend([0] * (cnt - len(out)))
return out
答案 1 :(得分:0)
from itertools import groupby, izip_longest, ifilter, repeat
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
def merge(line):
size = len(line)
resul = []
for num,val in groupby(ifilter(bool,line)):
for pair in grouper(val,2,0):
resul.append( sum(pair) )
if len(resul) < size:
resul.extend( repeat(0,size-len(resul)) )
return resul
首先使用ifilter
我消除了0,然后gruopby
给出了相同数字的组中的数字,并且grouper
我与我总结的那些组合并附加到结果。最后,如果需要,我使用extend方法将缺少的0追加到最后
答案 2 :(得分:0)
这是我尝试的方式:我删除所有0,但我记得,有多少。然后我浏览列表,总是比较两个项目。如果它们是相同的,那么我保存总和并记住,我不想在下一步中考虑第二个。如果它们不相同,那么我只是按原样添加值。最后,我查看最后一个值并添加缺失的0。
l = [8,16,16,8]
z = l.count(0)
l = [x for x in l if x!=0]
new = []
go_over = []
for i in range(len(l)-1):
if i in go_over:
continue
if l[i] == l[i+1]:
new.append(2*l[i])
go_over.append(i+1)
else:
new.append(l[i])
if len(l)-1 not in go_over:
new.append(l[-1])
new += [0]*(len(go_over)+z)
print(new)