0

我已经在我的代码中实现了以下列表理解,并且它有效:

[string for row in series for string in row]

背景:我有一个熊猫系列的字符串列表。所以系列的每一行都有一个列表,每个列表都有几个字符串。所以我想使用列表推导从系列中的每个列表中提取所有字符串并将它们编译成一个大列表。

问题:只是阅读语法,我无法直观地理解理解中发生的事情。谁能用简单的英文拼写出来?例如,对于标准列表理解([x for x in z]),我可以将其描述为“一个列表,其中每个 x 在 z 中都有 ax”。

我不知道这是否真的是一个可行的问题,但我认为值得一问!谢谢。

4

2 回答 2

2

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')
于 2020-08-12T19:29:18.783 回答
1

它所做的只是展平列表列表,例如

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, 2, 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(但我不确定这是否仍然适用于 a pd.Series):

import itertools
result  = list(itertools.chain(*series.tolist()))
于 2020-08-12T19:06:27.223 回答