问题描述
我已经在代码中实现了以下列表理解,并且可以正常工作:
[string for row in series for string in row]
背景:我有一系列的熊猫字符串列表。因此,该系列的每一行都有一个列表,并且每个列表都有几个字符串。因此,我想使用列表推导从系列中的每个列表中拉出所有字符串,并将它们编译为一个大列表。
问题:仅阅读语法,我就无法凭直觉理解理解的内容。谁能用简单的英语拼写出来?例如,对于标准列表理解([x for z in x]),我可以将其描述为“ z中每个x都有x的列表。”
我不知道这是否真的是一个可行的问题,但我认为这值得一问!谢谢。
解决方法
numpy
是您的朋友。使用它并跳过for循环
# sample series
s = pd.Series([list('abcd'),list('efgh'),list('ijkl')])
# concat your series
l = np.concatenate(s)
array(['a','b','c','d','e','f','g','h','i','j','k','l'],dtype='<U1')
,
它所做的只是将列表列表弄平,例如
nested_list = [[1,2,3],[4],[5,6]]
flat_list = [item for inner_list in nested_list for item in inner_list]
# flat_list will be [1,3,4,5,6]
要理解它,只需将其写成嵌套的for循环即可:
result = []
for row in series:
for string in row:
result.append(string)
基本上,它作为嵌套循环从左到右读取,但是内部代码位于开头。
您可以通过弄乱原始代码中的间距来看到这种情况:
result = [
string
for row in series # : <- pretend colons
for string in row # :
# result.append(string) <- this bit just goes to the start in list comprehension land
]
顺便说一句,您显然可以使用itertools.chain
来做得更快(但是我不确定这是否仍然适用于pd.Series
):
import itertools
result = list(itertools.chain(*series.tolist()))