【问题标题】:How to generate new list from variable in a loop?如何从循环中的变量生成新列表?
【发布时间】:2013-06-03 01:18:22
【问题描述】:

我的实际示例涉及更多,因此我将概念归结为一个简单示例:

l = [1,2,3,4,5,6,7,8]

for number in l:
    calc = number*10
    print calc

对于循环的每次迭代,我都会得到一个变量 (calc),我想用它来填充一个新列表。我的实际过程不仅仅是将值乘以10,所以我希望能够通过这种方法设置新列表中的每个值。新代码可能如下所示:

l = [1,2,3,4,5,6,7,8]

for number in l:
    calc = number*10
    # set calc as x'th entry in a new list called l2 (x = iteration cycle)

print l2

然后它将打印新列表:[10,20,30,40,...]

【问题讨论】:

  • 你为什么不能只做l2.append(calc)

标签: python


【解决方案1】:

有几种选择...

列表推导

如果足够短,请使用list comprehension

new_list = [number * 10 for number in old_list]

map()

您也可以使用map(),如果该函数之前存在(或者您将使用lambda):

def my_func(value):
    return value * 10

new_list = map(my_func, old_list)

请注意,在 Python 3.x 中 map() 不会返回列表(因此您需要执行以下操作:new_list = list(map(my_func, old_list)))。

使用简单的for ... in 循环填充其他列表

或者你可以使用简单的循环 - 它仍然有效并且 Pythonic:

new_list = []

for item in old_list:
    new_list.append(item * 10)

发电机

有时,如果您有很多处理(正如您所说的那样),您想在请求时懒惰地执行它,或者结果可能太大,您可能希望使用生成器。生成器会记住生成下一个元素的方式并忘记之前发生的任何事情(我正在简化),因此您可以遍历它们一次(但您也可以显式创建例如存储所有结果的列表)。

在你的情况下,如果这只是为了打印,你可以使用这个:

def process_list(old_list):
    for item in old_list:
        new_item = ...  # lots of processing - item into new_item
        yield new_item

然后打印出来:

for new_item in process_list(old_list):
    print(new_item)

有关生成器的更多信息,您可以在 Python 的 wiki 中找到:http://wiki.python.org/moin/Generators

访问“迭代次数”

但如果您的问题更多是关于如何检索迭代次数,请查看enumerate()

for index, item in enumerate(old_list):
    print('Item at index %r is %r' % (index, item))

【讨论】:

    【解决方案2】:

    这里是如何做到这一点,而无需直接跳入列表推导。使用l 作为变量名不是一个好主意,因为它在某些字体中与1 相同,所以我更改了它(虽然l1 并没有更好:))

    l1 = [1,2,3,4,5,6,7,8]
    l2 = []
    for number in l1:
        calc = number*10
        print calc
        l2.append(calc)
    

    列表推导确实提供了一种更紧凑的方式来编写这种模式

    l2 = [ number*10 for number in l1 ]
    

    【讨论】:

    • 我有一个问题。为什么 Python 在运行此代码时将值 8 分配给 number 并将其存储为变量?很好的解决方案。
    • @Seanosapien,你的意思是为什么循环完成后number 在范围内? Python 循环不会创建新的范围,因此在其中创建的任何变量都将保留在函数的范围内(如果您的循环不在函数中,则保留在全局范围内)
    • @JohnLaRooy,谢谢。我只是觉得奇怪的是,当使用 .append 而不是其他情况时存储变量。
    【解决方案3】:

    使用list comprehension

    >>> l = [1,2,3,4,5,6,7,8]
    >>> l2 = [ item*10 for item in l]
    >>> l2
    [10, 20, 30, 40, 50, 60, 70, 80]
    

    这大致相当于,但列表推导比普通的 for 循环更快:

    >>> l2 = []
    >>> for number in l:
    ...     calc = number * 10  #do some more calculations
    ...     l2.append(calc)     #appends the final calculated value at the end of l2
    ...     
    >>> l2
    [10, 20, 30, 40, 50, 60, 70, 80]
    

    您还可以为您正在执行的所有计算创建一个函数,然后在列表推导中调用该函数:

    def solve(x):
       #do some calculations here
       return calculated_value
    
    l2 = [ solve(item) for item in l]
    

    【讨论】:

    • 感谢您的提示。在我的实际示例中进行了大量计算,因此我希望能够从循环中的变量填充列表。您的示例将解决 x10 问题,但我的问题涉及大量查找和计算才能确定因变量。我可以在循环中计算出我想要的值,所以我想使用该变量为循环的每次迭代填充列表中的每个项目。
    • @bigCow 然后使用第二种方法,即使用list.append
    • @bigCow:这通常取决于您是否将“大量查找和计算”封装在单个函数中 - 取决于此,理解、循环或映射(请参阅我的回答)或多或少合适的。它主要归结为它看起来有多漂亮或代码应该有多灵活,但速度也有细微的差异(如果你有预先存在的功能,map() 可能是最有效的)。
    • @Tadeck 我认为人们不太喜欢mapstackoverflow.com/a/16329617/846892
    • @AshwiniChaudhary:有些人肯定不喜欢map(),但它仍然有它的用途。仍然有必要的证据是 map() 尚未从 Python 3.x 的内置函数中删除,尽管例如。将reduce() 移动到模块之一:docs.python.org/3.1/library/functions.html#map
    【解决方案4】:

    所以我相信你想对列表的每个元素应用一个函数。

    你试过列表推导吗?

    [num*10 for num in l]
    

    应该为您提供这个简单示例所需的内容。

    当然,如果您有一些更复杂的操作集,您可以使用之前定义的函数,即:

    def explode(n):
        return (n + (n * n) - (3 * n))
    
    [explode(num) for num in l]
    

    【讨论】:

      【解决方案5】:

      您的问题的一个简单答案是将calc 附加到如下所示的列表中:

      l = [1,2,3,4,5,6,7,8]
      
      your_list = []
      for number in l:
          calc = number*10
          your_list.append(calc)
      

      要访问列表中的变量,请使用切片语法。

      即,列表中的第二个元素是your_list[1],第五个是your_list[4]

      我怀疑您有时需要清空列表。要进行切片,请使用calc[:] = []

      【讨论】:

        【解决方案6】:

        其他人都给了你正确的答案:使用列表推导式。

        我会给你一个替代的正确答案:使用带有 lambda 或函数的 map。

        当“函数”非常简单时,您可以使用 lambda:

        print map(lambda x: x*10,[1,2,3,4,5,6,7,8])
        # [10, 20, 30, 40, 50, 60, 70, 80]
        

        map使用的函数可以是任意复杂的,那么使用函数更容易:

        def more_complex(x):
            # can be as complex as a function can be
            # for now -- *10
            return x*10
        
        print map(more_complex,[1,2,3,4,5,6,7,8])
        

        但这也适用于理解:

        l2=[more_complex(x) for x in [1,2,3,4,5,6,7,8]]
        

        只是为了让您熟悉映射与列表理解的形式。

        【讨论】:

        • 值得注意的是,map 是 Python 3 中的一个生成器,所以如果你想做任何索引或任何其他需要的事情,你需要将它包装在对 list 的调用中一个实际的列表。
        【解决方案7】:

        生成列表的循环

        KOT = []
        l = [1,2,3,4,5,6,7,8]
        
        
        for number in l:
            calc = number*10
            KOT.append(calc)
        

        你得到了 KOT 列表

        KOT = [10, 20, 30, 40, 50, 60, 70, 80]
        

        【讨论】:

          猜你喜欢
          • 2016-10-16
          • 2021-03-25
          • 2017-08-16
          • 2021-09-14
          • 2017-08-06
          • 2022-01-13
          • 2016-04-17
          • 2022-11-30
          • 1970-01-01
          相关资源
          最近更新 更多