【问题标题】:Is there a more pythonic, possibly one liner, to iterate over a string within a list?是否有更 Pythonic(可能是一个衬垫)来迭代列表中的字符串?
【发布时间】:2014-07-19 03:07:07
【问题描述】:

字符串是可迭代的。 列表是可迭代的。 并且对于字符串列表,列表和字符串都可以通过嵌套循环进行迭代。

例如:

input = [ 'abcdefg', 'hijklmn', 'opqrstu']
for item in input:
     for letter in item:
        print letter

输出:

a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u

似乎我们可以在迭代中迭代字符串,即迭代“abcdefg”的每个字母。是否有一种更 Pythonic 的方式来进行上述迭代,可能在一个语句中?

我重新阅读了 Python Cookbook 的 Learning Python 第 4 章和第 1 章,并查看了此处in python: iterate over each string in a list 和此处Displaying and iterating a list within a string?

【问题讨论】:

    标签: python string list iteration


    【解决方案1】:

    你可以使用itertools.chain.from_iterable():

    >>> from itertools import chain
    >>> input = ['abcdefg', 'hijklmn', 'opqrstu']
    >>>
    >>> for letter in chain.from_iterable(input):
    ...     print letter
    ... 
    a
    b
    c
    d
    e
    f
    g
    h
    i
    j
    k
    l
    m
    n
    o
    p
    q
    r
    s
    t
    u
    

    【讨论】:

    • 您是否同意@ecatmur 使用内置功能优于导入库,因为显式优于隐式,为什么?
    • @Aaron 不同意。使用itertools 没有任何问题(事实上,如果情况需要,建议使用它,就像这个一样)。此外,for letter in chain.from_iterable(input) 尽可能明确。如果您对此感到担心,只需写一条说明循环意图的注释即可。
    【解决方案2】:

    使用itertools.chain:

    for letter in itertools.chain(*input):
        print letter
    

    【讨论】:

      【解决方案3】:

      你写的已经是最pythonic的方式了;已经有两层嵌套(列表中的字符串中的字母),因此有两个嵌套的for 循环是正确的。

      如果您真的想使用单个 for 语句,您可以使用生成器理解来折叠循环:

      for letter in (letter for item in input for letter in item):
          print letter
      

      【讨论】:

      • 我可以用什么来确定我应该使用一两个 for 语句? IMO,您的单曲 for 语句看起来很优雅。使用你的单 for 语句会有什么缺点?
      • @Aaron 在单个语句中包含很多文本,并且重复letter 的次数超过了必要的次数(3 次,而两个 for 语句只有 1 次)。
      • 谢谢。鉴于letter 的三次重复,是否最好按照其他人的建议导入库,或者使用内置功能,例如生成器?
      • itertools 应该在任何优秀的 Python 程序员的军械库中,但是生成器对正在发生的事情更清楚,所以(因为 显式优于隐式)我认为那会胜出。
      【解决方案4】:

      这就够了, 其他一切都只是一个学术难题

      for item in ''.join(input):
          print item
      

      【讨论】:

      • 您的解决方案是打印字符,但没有回答明确要求迭代的问题。您的“加入”正在内存中构造完整的字符串,这可能是大列表的问题。
      • 不是我的首选答案,但鉴于该问题专门询问字符串列表,而不是更笼统的情况,我真的看不出投票的理由。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多