【问题标题】:Adding new values to empty nested lists向空的嵌套列表添加新值
【发布时间】:2017-02-25 18:02:05
【问题描述】:

这与How to append to the end of an empty list? 相关,但我还没有足够的声誉在那里发表评论,所以我在这里发布了一个新问题。

我需要将术语附加到一个空的列表列表中。我开始:

Talks[eachFilename][TermVectors]=
      [['paragraph','1','text'],
       ['paragraph','2','text'],
       ['paragraph','3','text']]

我想以

结束
Talks[eachFilename][SomeTermsRemoved]=
      [['paragraph','text'],
       ['paragraph','2'],
       ['paragraph']]

Talks[eachFilename][SomeTermsRemoved] 开始为空。我无法指定我想要的:

Talks[eachFilename][SomeTermsRemoved][0][0]='paragraph'
Talks[eachFilename][SomeTermsRemoved][0][1]='text'
Talks[eachFilename][SomeTermsRemoved][1][0]='paragraph'

等...(IndexError:列表索引超出范围)。如果我强制填充字符串然后尝试更改它,我会得到一个字符串是不可变的错误。

那么,我如何指定我希望Talks[eachFilename][SomeTermsRemoved][0]['paragraph','text'],而Talks[eachFilename][SomeTermsRemoved][1]['paragraph','2'] 等等?

.append 有效,但只生成一个长列,而不是一组列表。

更具体地说,我有许多在 dict 中初始化的列表

Talks = {}
Talks[eachFilename]= {}
Talks[eachFilename]['StartingText']=[]
Talks[eachFilename]['TermVectors']=[]
Talks[eachFilename]['TermVectorsNoStops']=[]

eachFilename 从文本文件列表中填充,例如:

Talks[eachFilename]=['filename1','filename2']

StartingText 有几行长文本(单个段落)

Talks[filename1][StartingText]=['This is paragraph one','paragraph two']

TermVectors 由 NLTK 包填充,其中包含术语列表,仍分组在原始段落中:

Talks[filename1][TermVectors]=
     [['This','is','paragraph','one'],
      ['paragraph','two']]

我想进一步操作TermVectors,但保留原来的段落列表结构。这将创建一个每行 1 个术语的列表:

for eachFilename in Talks:
    for eachTerm in range( 0, len( Talks[eachFilename]['TermVectors'] ) ):
        for term in Talks[eachFilename]['TermVectors'][ eachTerm ]:
            if unicode(term) not in stop_words:
                Talks[eachFilename]['TermVectorsNoStops'].append( term )

结果(我失去了我的段落结构):

Talks[filename1][TermVectorsNoStops]=
     [['This'],
      ['is'],
      ['paragraph'],
      ['one'],
      ['paragraph'],
      ['two']]

【问题讨论】:

  • 不清楚这里的问题是什么。 Talks[eachFilename][SomeTermsRemoved] 在你的代码中是如何定义的?

标签: python list assign


【解决方案1】:

一些持续的实验以及 cmets 让我朝着解决方案前进。我没有附加每个单独的术语,从而生成一个长列表,而是将术语累积到一个列表中,然后附加每个列表,如下所示:

for eachFilename in Talks:
    for eachTerm in range( 0, len( Talks[eachFilename]['TermVectors'] ) ):
        term_list = [ ]
        for term in Talks[eachFilename]['TermVectors'][ eachTerm ]:
            if unicode(term) not in stop_words:
                term_list.append(term)
        Talks[eachFilename]['TermVectorsNoStops'].append( term )

谢谢大家!

【讨论】:

  • 哦,所以不是TermVectors失去了它的形状,而是TermVectorNoStops...你在你的问题中说的相反。
  • 这是正确的。对于许多不一致之处,我深表歉意。我试图以简短的方式提出这个问题,以节省人们的时间,我应该简单地准确地发布我的代码。由于我显然是 python 新手,我觉得我的代码很难理解,而且解释我的问题比发布令人困惑的非 pythonic 代码更容易。再次感谢您的帮助!
【解决方案2】:

您报告的错误(字符串不可变?)没有任何意义,除非您的列表实际上不是空的但已经填充了字符串。无论如何,如果您从一个空列表开始,那么填充它的最简单方法是添加:

>>> talks = {}
>>> talks['each_file_name'] = {}
>>> talks['each_file_name']['terms_removed'] = []
>>> talks['each_file_name']['terms_removed'].append(['paragraph','text'])
>>> talks['each_file_name']['terms_removed'].append(['paragraph','2'])
>>> talks['each_file_name']['terms_removed'].append(['paragraph'])
>>> talks
{'each_file_name': {'terms_removed': [['paragraph', 'text'], ['paragraph', '2'], ['paragraph']]}}
>>> from pprint import pprint
>>> pprint(talks)
{'each_file_name': {'terms_removed': [['paragraph', 'text'],
                                      ['paragraph', '2'],
                                      ['paragraph']]}}

如果你有一个空列表并尝试使用索引分配给它,它会抛出一个错误:

>>> empty_list = []
>>> empty_list[0] = 10
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range

顺便说一句,代码如下:

for eachFilename in Talks:
    for eachTerm in range( 0, len( Talks[eachFilename]['TermVectors'] ) ):
        for term in Talks[eachFilename]['TermVectors'][ eachTerm ]:
            if unicode(term) not in stop_words:
                Talks[eachFilename]['TermVectorsNoStops'].append( term )

与正确的 Python 风格相去甚远。不要使用 camelCase,使用 snake_case。不要大写变量。此外,在您的中级 for 循环中,您使用 for eachTerm in range(0, len(Talks[eachFilename]['TermVectors'],但 eachTermint,因此使用标准 i jk 更有意义。甚至idx

无论如何,没有理由让代码变成这样:

Talks[filename1][TermVectors] =
     [['This','is','paragraph','one'],
      ['paragraph','two']] 

进入这个:

Talks[filename1][TermVectors] =
     [['This'],
      ['is'],
      ['paragraph'],
      ['one'],
      ['paragraph'],
      ['two']]

这是一个可重复的示例(我已经为你做了这个,但你应该在发布问题之前自己做这个):

>>> pprint(talks)
{'file1': {'no_stops': [],
           'term_vectors': [['This', 'is', 'paragraph', 'one'],
                            ['paragraph', 'two']]},
 'file2': {'no_stops': [],
           'term_vectors': [['This', 'is', 'paragraph', 'three'],
                            ['paragraph', 'four']]}}
>>> for file in talks:
...   for i in range(len(talks[file]['term_vectors'])):
...     for term in talks[file]['term_vectors'][i]:
...       if term not in stop_words:
...         talks[file]['no_stops'].append(term)
... 
>>> pprint(file)
'file2'
>>> pprint(talks)
{'file1': {'no_stops': ['This', 'paragraph', 'one', 'paragraph'],
           'term_vectors': [['This', 'is', 'paragraph', 'one'],
                            ['paragraph', 'two']]},
 'file2': {'no_stops': ['This', 'paragraph', 'paragraph', 'four'],
           'term_vectors': [['This', 'is', 'paragraph', 'three'],
                            ['paragraph', 'four']]}}
>>> 

更 Pythonic 的方法如下所示:

>>> pprint(talks)
{'file1': {'no_stops': [],
           'term_vectors': [['This', 'is', 'paragraph', 'one'],
                            ['paragraph', 'two']]},
 'file2': {'no_stops': [],
           'term_vectors': [['This', 'is', 'paragraph', 'three'],
                            ['paragraph', 'four']]}}
>>> for file in talks.values():
...   file['no_stops'] = [[term for term in sub if term not in stop_words] for sub in file['term_vectors']]
... 
>>> pprint(talks)
{'file1': {'no_stops': [['This', 'paragraph', 'one'], ['paragraph']],
           'term_vectors': [['This', 'is', 'paragraph', 'one'],
                            ['paragraph', 'two']]},
 'file2': {'no_stops': [['This', 'paragraph'], ['paragraph', 'four']],
           'term_vectors': [['This', 'is', 'paragraph', 'three'],
                            ['paragraph', 'four']]}}
>>> 

【讨论】:

  • 对不起@juanpa.arrivillaga,你对空列表的错误是正确的。当列表最初为空时,我收到“IndexError:列表索引超出范围”。我会在上面编辑这个......
猜你喜欢
  • 2019-01-31
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
  • 2021-11-24
  • 1970-01-01
相关资源
最近更新 更多