我有一个列表(即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"...]
任何人都有一个代码片段来有效地执行此任务吗?
答案 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)