在这种情况下如何从列表理解到循环?

How to go from list comprehension to loop in this case?

我必须在不使用列表理解的情况下执行以下操作。 我有一个如下所示的列表:

["Mi Fa Sol", 'Mi', "Mi Fa Sol La Si", "Do Si", " Mi Si Fa", "Fa"]

我要获取的是如下列表:

["Mi", "Fa", "Sol", "Mi", "Mi", "Fa", "Sol", "La", "Si", "Do", "Si", "Mi", "Si", "Fa", "Fa"]

我认为我可以通过以下方式做到这一点:

    lst = [elem.strip().split() for elem in lst]
    lst = [elem for sub_lst in lst for elem in sub_lst]

但我不知道如何在没有列表推导的情况下实现相同的结果。

您当前使用两个单独的列表理解的版本可以简化为使用单个列表理解:

lst = [e for elem in lst for e in elem.split()]

但是,如果您想改用传统的 for 循环,则可以像现在一样循环遍历 lst 的每个 elem,然后使用 list.extend() 将拆分后的元素添加到结果列表 res:

lst = ["Mi Fa Sol", 'Mi', "Mi Fa Sol La Si", "Do Si", " Mi Si Fa", "Fa"]
res = []
for elem in lst:
    res.extend(elem.split())
print(res)

输出:

['Mi', 'Fa', 'Sol', 'Mi', 'Mi', 'Fa', 'Sol', 'La', 'Si', 'Do', 'Si', 'Mi', 'Si', 'Fa', 'Fa']

如果以后需要,您可以将 res 分配回 lst

旁注:由于您使用 split() 的默认分隔符,在这种情况下您也可以省略多余的 strip()

这是一个实用的方法:

>>> music = ["Mi Fa Sol", 'Mi', "Mi Fa Sol La Si", "Do Si", " Mi Si Fa", "Fa"]
>>> reduce(lambda x, y: x + y, map(str.split, music))
['Mi', 'Fa', 'Sol', 'Mi', 'Mi', 'Fa', 'Sol', 'La', 'Si', 'Do', 'Si', 'Mi', 'Si', 'Fa', 'Fa']

lambda 表达式可以替换为 operator.add:

>>> import operator
>>> reduce(operator.add, map(str.split, music))
['Mi', 'Fa', 'Sol', 'Mi', 'Mi', 'Fa', 'Sol', 'La', 'Si', 'Do', 'Si', 'Mi', 'Si', 'Fa', 'Fa']

要使上述代码段在 Python 3 中正常工作,您必须包含以下句子:

from functools import reduce