如何评估相同列表中的两个项目并返回它们的总和,如果相等?

时间:2016-01-29 00:22:46

标签: python list function python-2.7

这是在线课程作业的一部分,我们被要求为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]

非常感谢您的帮助

3 个答案:

答案 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)

我也使用了groupbygrouper食谱

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)