列表标识和排序:整数和字符串

时间:2014-07-28 21:32:49

标签: list sorting

我有一个列表(即list1),它包含一个整数,然后是一组字符串(1到5个项目),然后是另一个整数和一组字符串等。所以列表看起来像[1, "biology", "physics", 2, "chemistry", "history", ...]。我想循环遍历列表,id为第一个整数,将其分配给新列表(即list2),将字符串分配给新列表(即list3),找到下一个整数将其分配给list2,添加下一个字符串到list3等。

所以最终的名单将是:

list1[1, "biology", "physics", 2, "chemistry", "history"...]
list2[1,2...]
list3["biology", "physics", "chemistry", "history"...]

任何人都有一个代码片段来有效地执行此任务吗?

1 个答案:

答案 0 :(得分:0)

列表分区

这是在函数式编程中广泛使用的模式,称为分区条件列表。

您从iterable和谓词pred开始,并且您希望获得两个列表,一个用于iterable中与谓词匹配的项目,另一个用于与谓词匹配的项目不

假设您使用的是Python,您可以过滤与其他谓词匹配的项目:

def partition(pred, iterable):
    return filter(pred, iterable), filter(lambda x: not pred(x), iterable)

如果迭代次数很大,你也可以避免迭代迭代两次,只扫描所有项目并将它们附加到相应的列表中:

def partition(pred, iterable):
    match, nomatch = [], []
    for item in iterable:
        (match if pred(item) else nomatch).append(item)
    return match, nomatch

如果您使用的是Python 3,则partition中已包含itertools,其语法与上面定义的语法相同,因此您只需:{/ p>

from itertools import partition

对于您的列表分区实例,您可以这样做:

list1 = [1, "biology", "physics", 2, "chemistry", "history"]
list2, list3 = partition(lambda obj: isinstance(obj, int), list1)