【问题标题】:Two for loops in a comprehensive list综合列表中的两个 for 循环
【发布时间】:2016-03-12 21:53:31
【问题描述】:
x = 'green apple'
L = []
for word in x.split():
    for letter in word:
        L.append(letter)
    print(L)

下面会产生我想要的,它是一个包含字符串 x 中所有字母的列表。如何在一行代码中包含这两个 for 循环?

【问题讨论】:

  • @kaveh 有没有一种方法可以让我产生 ['g', 'r', 'e', 'e', 'n', 'a', 'p', 'p ', 'l', 'e'] 有一个循环?
  • 出于好奇,所有发布的解决方案(包括我的)都没有考虑到print 函数。你真的要打印['g', 'r', 'e', 'e', 'n'] 然后['g', 'r', 'e', 'e', 'n', 'a', 'p', 'p', 'l', 'e'] 吗?如果是这样,我认为您不会比循环好太多——尽管内部循环可以替换为L.extend(word)
  • 你知道为什么它会打印两个列表吗?我只对第二个完整的感兴趣

标签: python list loops


【解决方案1】:
x = 'green apple'
print [i for i in x if i !=" "]

你可以直接这样做。

输出:['g', 'r', 'e', 'e', 'n', 'a', 'p', 'p', 'l', 'e']

import re
x = 'green apple'
print re.findall("\S",x)

【讨论】:

  • 如果您的输入真的像'green apple' 一样简单,这就是我要采用的解决方案。 . .
【解决方案2】:

列表推导嵌套的方式与循环相同。所以,最外面的循环在最里面的循环之前。

>>> x = 'green apple'
>>> [c for word in x.split() for c in word]
['g', 'r', 'e', 'e', 'n', 'a', 'p', 'p', 'l', 'e']

我通常不使用嵌套列表推导,因为我发现我并不总是记住顺序,但我知道有些人确实使用它们,因此能够记住如何使用它们很有用它们筑巢。

在这种情况下,我通常更喜欢使用itertools.chain

import itertools
print list(itertools.chain.from_iterable(x.split()))

【讨论】:

  • 也使用星形参数list(itertools.chain(*x.split()))
  • @AyushShanker -- 当然,这会起作用,但作为一种习惯,我避免使用带有“star-args”的chain,因为在某些情况下,这会使可迭代变得不那么懒惰——而 itertools 的全部意义在于进行 more 惰性评估 :-)。在这种情况下,它并没有太大的区别(除了养成一个可能的坏习惯)。
【解决方案3】:
>>> list(x.replace(' ',''))
# ['g', 'r', 'e', 'e', 'n', 'a', 'p', 'p', 'l', 'e']

也适用于线条

【讨论】:

    【解决方案4】:

    如果你可以离开空格,你可以简单地使用列表功能:

    x = 'green apple'
    print list(x)
    

    省略空格:

    x = 'green apple'
    print [letter for letter in x if not letter == ' ']
    

    【讨论】:

    • 字符串是可迭代的,因此不需要list(x) -- x 本身就足够了。另外,我怀疑是否有太多人喜欢列表理解中的_。只是感觉有点奇怪。 . .
    • @mgilson 注意到并修改了 :)
    • 啊,PEP8 建议不要使用l 作为变量名(显然它在某些字体中看起来太像1);-)。
    • 是的。出于这个原因,我不喜欢将“l”作为变量名,让我们使用像letter 这样的完全明确的名称来代替。干杯。
    【解决方案5】:

    您根本不需要 for 循环。你也可以这样做:

    >>> x = "green apple"
    >>> list(x)
    ['g', 'r', 'e', 'e', 'n', ' ', 'a', 'p', 'p', 'l', 'e']
    

    【讨论】:

    • 不完全——你会有一个额外的空间(其他人已经发布了过滤掉它的解决方案)。
    • 这不占空间。
    猜你喜欢
    • 2021-02-28
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    相关资源
    最近更新 更多