普通话中的双重清单理解

问题描述

我已经在代码中实现了以下列表理解,并且可以正常工作:

[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()))