我从未使用过列表理解,但过去几个小时都在尝试将我读过的内容应用到我正在处理的方法中。我很难应用我见过的例子。
给定一个列表,创建一个大小相等的新列表。在该新列表中,将所有数字向左移动,向右移动零。因此,例如,[0,3,0,4]将返回[3,4,0,0]。我有一个工作方法可以做到这一点:
def merge(self, line):
results = [0] * len(line)
count = 0
for number in line:
if number != 0:
results[count] = number
count += 1
return results
每当我尝试压缩它时,我都会感到难以理解如何在没有索引的情况下完成results[count] = number
。
答案 0 :(得分:2)
你可以这样做:
def merge(self, line):
return ([x for x in line if x] + ([0] * len(line)))[:len(line)]
这将从line
获取非零项目,然后用零填充,切片以确保适当的长度。
由于您没有使用任何类或实例参数,因此可以将其作为静态方法来删除不必要的参数:
@staticmethod
def merge(line):
return ([x for x in line if x] + ([0] * len(line)))[:len(line)]
但请注意,您当前的版本清晰,可读且内存效率高于此(构建两个列表,将它们添加到第三个列表然后切出第四个列表)。
答案 1 :(得分:2)
尝试:
l = [0, 3, 0, 4]
nl = [ x for x in l if x != 0]
print nl.extend([0] * (len(l) - len(nl))
答案 2 :(得分:2)
尝试以下方法:
def merge(self, line):
return [item for item in line if item != 0]+[0 for item in line if item == 0]
运行方式:
>>> merge([0, 3, 0, 4])
[3, 4, 0, 0]
>>>
答案 3 :(得分:0)
在您的情况下,只需按布尔键对列表进行排序:
def merge(self, line):
return sorted(line, key=lambda x: not bool(x))
是的,此解决方案不包含列表解析。但并不是每一个问题都用锤子解决了。
答案 4 :(得分:0)
这很麻烦,但这里有一个理解:
l1 = [0, 3, 0, 4]
l2 = [i for i in filter(bool, l1) + list(repeat(0, len(l1) - len(filter(bool, l1))))]
print l2 # prints '[3, 4, 0, 0]'
你可能甚至不包括理解,因为它是多余的:
l1 = [0, 3, 0, 4]
l2 = filter(bool, l1) + list(repeat(0, len(l1) - len(filter(bool, l1))))
print l2 # prints '[3, 4, 0, 0]'
此外,您应该使用某种状态进行计算,以避免重复工作:
l1 = [0, 3, 0, 4]
l2 = filter(bool, l1)
l3 = l2 + list(repeat(0, len(l1) - len(l2)))
print l3 # prints '[3, 4, 0, 0]'