我正在学习python并且有一个工作代码(如下所示)。但是,我想知道是否有更好的方法可以在下面重写它。
我想要做的是匹配传递给方法的列表A与预定义列表B.如果列表A中的项目包含列表B中的项目,我想将其移动到列表的结尾A.以下是一个例子:
# example 1
a = [1, 2, 3, 4, 5]
sanitized_list = sanitize(a) # [3, 4, 5, 1, 2]
# example 2
a = [3, 6, 1, 7, 4]
sanitized_list = sanitize(a) # [3, 6, 7, 4, 1]
def sanitize(arg):
# predefined list
predefined_list = [1, 2]
for item in predefined_list:
try:
# check to see if 'arg' contain any item
# in the predefined list
i = arg.index(item)
# save the value of arg[i]
j = arg[i]
# remove "j" from "arg"
arg.pop(i)
# append item to end of "arg"
arg.append(j)
except ValueError:
pass
return arg
答案 0 :(得分:3)
你可以使用排序;简单地对遏制测试的结果进行排序; False
在True
之前排序,但您的订单仍然保持稳定。您可以设置b
一套以更快地进行收容测试:
def sanitize(lst):
# predefined list
b = {1, 2}
return sorted(lst, key=lambda v: v in b)
我在这里设置b
,但这是可选的(如果你这样做的话会更快)。
因此对于lst
中的每个元素,如果该元素位于b
中,则 之后 中的任何内容<{1}} },但保持相对的顺序。
请注意,而不是b
我在这里使用了不同的名称;你不想暗示内置类型。
演示:
list
答案 1 :(得分:0)
最好总是创建一个新列表:
def sanitize(l):
b = set([1, 2])
result = ([], [])
for item in l:
result[item in b].append(item)
result[0].extend(result[1])
return result[0]
答案 2 :(得分:-1)
如果将列表转换为sets
,则列表之间的操作会更容易。
a = [1, 2, 3, 4, 5]
def sanitize(l):
b = [1, 2]
try:
sanitized = list(set(l) - set(b)) + b
return sanitized
except ValueError:
return None