python - 单列表迭代与多列表理解

标签 python python-2.7 list-comprehension

我有一个数据列表,我需要将其中的一些元素复制到几个不同的列表中。对列表进行单次迭代或执行多个列表推导会更好吗

例如

def split_data(data):
    a = []
    b = []
    c = []
    for d in data:
        if d[0]   >   1 : a.append(d)
        if d[1]   == 'b': b.append(d)
        if len(d) ==  3 : c.append(d)

    return a, b, c

对比

def split_data(data):
    a = [d for d in data if d[0]   >   1 ]
    b = [d for d in data if d[1]   == 'b']
    c = [d for d in data if len(d) ==  3 ]

    return a, b, c

我知道执行此操作的更 pythonic 方式是使用列表理解,但在这种情况下是这种情况吗?

最佳答案

在您的第一个示例代码中,它只需要使用多个 if 语句遍历数据一次,而后面的代码需要遍历数据 3 次。我相信列表理解将在大多数情况下通过对数据进行相同次数的迭代来赢得胜利。

对于像你的例子这样简单的操作,我更喜欢列表理解方法,当操作变得更复杂时,为了代码可读性,也许其他会更好。

对 2 函数的一些基准测试应该告诉您更多信息。 基于我对这 2 个函数的快速基准测试,使用一些虚拟数据集获取如下运行时间。这个运行时可能并不总是正确的,取决于数据集

# without list comprehension
>>> timeit.timeit('__main__.split_data([("a","b")] * 1000000)', 'import __main__', number=1)
0.43826036048574224

# with list comprehension
>>> timeit.timeit('__main__.split_data([("a","b")] * 1000000)', 'import __main__', number=1)
0.31136326966964134

关于python - 单列表迭代与多列表理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44666215/

相关文章:

python - scipy.stats 种子?

javascript - 支持 Visual Studio 中的数组理解

python - 通过 2D 数组作为索引范围对 1D 数组进行 Numpy View

python - 你能分解这个Pythonic列表理解吗

python - 嵌入 youtube 视频抓取的链接

python - 如何将 bool 条件包含到Python的列表理解中?

haskell - 为什么就地构建列表理解的元素会产生与在约束中构建不同的结果?

python - 命名空间包有哪些注意事项

python - 为什么在迭代时删除列表中的项目时索引会超出范围?

python - python 中的简单词干提取和词形还原