Python列表弹出和追加

时间:2014-09-14 21:03:32

标签: python list sorting

我正在学习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

3 个答案:

答案 0 :(得分:3)

你可以使用排序;简单地对遏制测试的结果进行排序; FalseTrue之前排序,但您的订单仍然保持稳定。您可以设置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