列表理解和 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']
假设
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']