【问题标题】:Check for multidimensional list in Python在 Python 中检查多维列表
【发布时间】:2014-03-26 21:28:14
【问题描述】:

我有一些一维或二维的数据。我想遍历数据集中的每个模式并对其执行 foo() 。如果数据是 1D 则将此值添加到列表中,如果是 2D 则取内部列表的平均值并附加此值。 我看到了this question,并决定实施它来检查列表的实例。我不能在这个应用程序中使用 numpy。

    outputs = []
    for row in data:
        if isinstance(row, list):
            vals = [foo(window) for window in row]
            outputs.append(sum(vals)/float(len(vals)))
        else:
            outputs.append(foo(row))

有没有更简洁的方法来做到这一点?在每次运行时,每个模式都将具有相同的维度,因此我可以为 1D/2D 创建一个单独的类,但这会在我的代码中添加很多类。数据集可能会变得非常大,因此最好采用快速解决方案。

【问题讨论】:

  • 我会检查 hasattr(row[0], '_iter_') 而不是 isinstance(),但我认为没有更快或更多的方法优雅的方式。
  • 对我来说看起来很整洁
  • Python3.4(如果你有幸使用它的话)介绍了一个statistics module
  • @knitti collections.Iterable 应该被使用,__iter__ 字符串失败。

标签: python list multidimensional-array


【解决方案1】:

您的代码已经几乎尽可能简洁和快速。唯一的微小改进是将[foo(window) for window in row] 替换为map(foo, row),这可以通过基准测试看出:

> python -m timeit "foo = lambda x: x+1; list(map(foo, range(1000)))"
10000 loops, best of 3: 132 usec per loop
> python -m timeit "foo = lambda x: x+1; [foo(a) for a in range(1000)]"
10000 loops, best of 3: 140 usec per loop

isinstance() 似乎已经比其对应的 hasattr()type() == 更快:

> python -m timeit "[isinstance(i, int) for i in range(1000)]"
10000 loops, best of 3: 117 usec per loop
> python -m timeit "[hasattr(i, '__iter__') for i in range(1000)]"
1000 loops, best of 3: 470 usec per loop
> python -m timeit "[type(i) == int for i in range(1000)]"
10000 loops, best of 3: 130 usec per loop


但是,如果你把 short 算作整洁,你也可以简化你的代码(在替换map 之后)到:

mean = lambda x: sum(x)/float(len(x)) #or `from statistics import mean` in python3.4
output = [foo(r) if isinstance(r, int) else mean(map(foo, r)) for r in data]

【讨论】:

    猜你喜欢
    • 2013-04-05
    • 2011-08-03
    • 2021-02-17
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多