4

我正在完成一个gensim教程,但遇到了一些我不明白的东西。texts是一个嵌套的字符串列表:

In [37]: texts
Out[37]:
[['human', 'machine', 'interface', 'lab', 'abc', 'computer', 'applications'],
 ['survey', 'user', 'opinion', 'computer', 'system', 'response', 'time'],
 ['eps', 'user', 'interface', 'management', 'system'],
 ['system', 'human', 'system', 'engineering', 'testing', 'eps'],
 ['relation', 'user', 'perceived', 'response', 'time', 'error', 'measurement'],
 ['generation', 'random', 'binary', 'unordered', 'trees'],
 ['intersection', 'graph', 'paths', 'trees'],
 ['graph', 'minors', 'iv', 'widths', 'trees', 'well', 'quasi', 'ordering'],
 ['graph', 'minors', 'survey']]

sum(texts,[])给出:

Out[38]:
['human',
 'machine',
 'interface',
 'lab',
 'abc',
 'computer',
 'applications',
 'survey',
 'user',
 'opinion',
 'computer',

该列表还有几行,但我省略了其余部分以节省空间。我有两个问题:

1)为什么会sum(texts,[])产生这种结果(即扁平化嵌套列表)?

2)为什么输出显示奇怪 - 每行一个元素?这个输出有什么特别的吗(......或者我怀疑它可能是我的 iPython 行为异常)。请确认您是否也看到了这一点。

4

3 回答 3

7

这是因为将列表添加在一起会将它们连接起来。

sum([a, b, c, d, ..., z], start)

相当于

start + a + b + c + d + ... + z

所以

sum([['one', 'two'], ['three', 'four']], [])

相当于

[] + ['one', 'two'] + ['three', 'four']

这给了你

['one', 'two', 'three', 'four']

请注意start,默认情况下是0,因为默认情况下它适用于数字,所以如果您尝试

sum([['one', 'two'], ['three', 'four']])

那么它会尝试相当于

0 + ['one', 'two'] + ['three', 'four']

它会失败,因为您不能将整数添加到列表中。


每一行的事情就是 IPython 决定输出你的长字符串列表的方式。

于 2013-10-18T15:35:30.570 回答
3

首先,它以这种方式显示,因为您使用的是 ipython。

第二,想想怎么sum可能定义。你熟悉函数式编程吗?

如果您要自己定义它,您将编写如下内容:

def sum(lst, start):
    if len(lst) == 1:
        return lst[0] + start
    else:
        return lst[0] + sum(lst[1:], start)

在列表列表上运行它相当于说

[['a','b'] + ['c','d'] + []] # for example

这导致:

['a','b','c','d']

或者,换句话说,展平列表。

于 2013-10-18T15:35:46.250 回答
0

因为您也可以对列表执行加法(和其他操作),所以您实际上是将列表添加在一起以创建一个巨大的列表。

['a'] + ['b'] = ['a','b']
于 2013-10-18T15:36:38.023 回答