【问题标题】:Python: Establishing List with List Comprehensions or IteratorsPython:使用列表理解或迭代器建立列表
【发布时间】:2015-10-06 14:37:12
【问题描述】:

我正在尝试通过将for 循环替换为列表推导、生成器和迭代器来改进我的编码和算法性能。

我很难琢磨如何实现itertools 中的工具,如果您能提供任何帮助,我将不胜感激。

我正在尝试为特定范围的索引初始化一个值为0 的列表。以下是我想出的两种方法:

count_list = [0 for index in range(4 ** k)]

total_index = list(range(4 ** k))
count_list = [0 for index in total_index]

(k表示由4个字母组成的单词中的数字字母的整数)

当我在 Python 3.4 中对代码进行计时时,结果发现第一个使用生成器的方法在单独查看时明显更快,但是当我不得不重用 @987654326 时@index 为另一个循环,这些方法最终以大致相同的速度计时。

我一直在努力弄清楚如何使用迭代器来复制此初始化。我知道如果我想创建索引中所有数字的列表,我可以使用 list(range()) 或者我可以使用

index_list = [index for index, values in enumerate(words)]

我只是不确定如何使用类似的方法将值 0 分配给每个元素。

我也想知道如何使用列表理解来摆脱这个for 循环。我猜我需要类似地图的东西,但我不确定如何实现。

for index in range(4 ** k):
    if frequency_array[index] >= t:
        clump[index] = 1

谢谢。

【问题讨论】:

    标签: python python-3.x generator list-comprehension itertools


    【解决方案1】:

    使用0 初始化您的列表:

    >>> my_list = [0] * 10
    >>> my_list
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    

    如果你想使用list理解而不是for循环,你可以这样做:

    >>>t = 3
    >>>l = [1,2,3,1,2,3,1,2,3,3,2,1]
    >>>new_list = [1 if l[i] >= t else l[i] for i in range(len(l))]
    >>>new_list
    [1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1]
    

    另外,您可以这样使用AND - OR 组合:

    >>>new_list = [l[i] >= t and 1 or l[i] for i in range(len(l))]
    >>>new_list
    [1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1]
    

    【讨论】:

      【解决方案2】:

      尝试[0] * 4**k 用零初始化列表。

      简单的基准测试:

      ~/Dev/Python/test ?  python -m timeit '[0] * 1000'
      100000 loops, best of 3: 5.15 usec per loop
      
      ~/Dev/Python/test ?  python -m timeit '[0 for index in range(1000)]'
      
      10000 loops, best of 3: 41.9 usec per loop
      

      【讨论】:

      • 你饿了吗?或者这只是一个编码问题?
      • 我能说什么,我喜欢汉堡!
      猜你喜欢
      • 2020-12-03
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      • 1970-01-01
      • 2016-07-09
      相关资源
      最近更新 更多