python按条件拆分列表_Python:根据条件拆分列表?

本文介绍了一种利用Python的懒惰迭代器方法来高效地根据条件拆分序列的技术。通过示例展示了如何使用`itertools`库实现两个生成器:一个用于收集满足条件的元素,另一个用于不满足条件的元素。此外,还提供了一个更通用的函数,可以根据特定键将项拆分到不同的列表中。
摘要由CSDN通过智能技术生成

UYOU

以下是懒惰迭代器方法:from itertools import teedef split_on_condition(seq, condition):

    l1, l2 = tee((condition(item), item) for item in seq)

    return (i for p, i in l1 if p), (i for p, i in l2 if not p)它每项计算一次条件,并返回两个生成器,首先从条件为真的序列中产生值,另一个生成条件为false的序列。因为它很懒,所以您可以在任何迭代器上使用它,甚至是无限迭代器:from itertools import count, islicedef is_prime(n):

    return n > 1 and all(n % i for i in xrange(2, n))primes, not_primes = split_on_condition(count(), is_prime)

    print("First 10 primes", list(islice(primes, 10)))print("First 10 non-primes", list(islice(not_primes, 10)))通常情况下,非延迟列表返回方法更好:def split_on_condition(seq, condition):

    a, b = [], []

    for item in seq:

        (a if condition(item) else b).append(item)

    return a, b编辑:对于通过某些键将项拆分为不同列表的更具体的用法,下面是一个通用函数:DROP_VALUE = lambda _:_def split_by_key(seq, resultmapping, keyfunc, default=DROP_VALUE):

    """Split a sequence into lists based on a key function.

        seq - input sequence

        resultmapping - a dictionary that maps from target lists to keys that go to that list

        keyfunc - function to calculate the key of an input value

        default - the target where items that don't have a corresponding key go, by default they are dropped

    """

    result_lists = dict((key, []) for key in resultmapping)

    appenders = dict((key, result_lists[target].append) for target, keys in resultmapping.items() for key in keys)

    if default is not DROP_VALUE:

        result_lists.setdefault(default, [])

        default_action = result_lists[default].append    else:

        default_action = DROP_VALUE    for item in seq:

        appenders.get(keyfunc(item), default_action)(item)

    return result_lists用法:def file_extension(f):

    return f[2].lower()split_files = split_by_key(files, {'images': IMAGE_TYPES}, keyfunc=file_extension, default='anims')

    print split_files['images']print split_files['anims']

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值