列表理解和 str.split() returns 列表而不是单个字符串

List comprehension and str.split() returns lists in list instead of individual strings

假设

thread_sold = ['white', 'white&blue', 'white&blue', 'white', 'white&yellow', 'purple', 'purple&yellow', 'purple&yellow']

我需要该列表中的所有项目,有时用分隔,有时不用。下面的函数有效,但我想知道如何通过列表理解来做到这一点。

def cant_list_comprehend(lst):
    thread_sold_split = []
    for i in lst:
        if "&" in i:
            for x in i.split("&"):
                thread_sold_split.append(x)
        else:
            thread_sold_split.append(i)
    return thread_sold_split

returns ['white', 'white', 'blue', 'white', 'blue', 'white', 'white', 'yellow', 'purple', 'purple', 'yellow', 'purple', 'yellow', 'blue', 'blue', 'purple', 'blue', 'white', 'white'...]

我试过的列表理解:

thread_sold_split_bad = [
    [x for x in y.split("&")] if "&" in y else y for y in thread_sold
]

returns ['white', ['white', 'blue'], ['white', 'blue'], 'white', ['white', 'yellow'], 'purple', ['purple', 'yellow'],...]

如果可以避免的话,我想避免在我的代码中添加命名函数,我也有兴趣用 lambda 函数解决这个问题,尽管我目前正在学习基础知识。

您可以使用 functools.reduce:

from functools import reduce

reduce(lambda x, y: x + y, [x.split("&") for x in thread_sold])

import itertools

list(itertools.chain.from_iterable(x.split("&") for x in thread_sold))

输出

['white', 'white', 'blue', 'white', 'blue', 'white', 'white', 'yellow', 'purple', 'purple', 'yellow', 'purple', 'yellow']
thread_sold_split_bad = [
    [x for x in y.split("&")] if "&" in y else y for y in thread_sold
]

您上面的尝试不起作用,因为您进行的是嵌套列表理解而不是普通理解(注意主括号内的括号)。这是更正后的版本:

>>> thread_sold_split = [x for y in thread_sold for x in y.split("&")]
>>> print(thread_sold_split)
['white', 'white', 'blue', 'white', 'blue', 'white', 'white', 'yellow', 'purple', 'purple', 'yellow', 'purple', 'yellow']