用列表理解替换字符串时发生TypeError

时间:2018-08-17 12:16:49

标签: python python-3.x pandas

我的代码非常简单:

['found' if 'some_string' in word else word for word in wordlist]

但是它返回

    TypeError                                 
Traceback (most recent call last)
    <ipython-input-108-990cad51d935> in <module>()
    ----> 1 [word  for word in wordlist if 'some_string' in word ]

    <ipython-input-108-990cad51d935> in <listcomp>(.0)
    ----> 1 [word  for word in wordlist if 'some_string' in word ]

    TypeError: argument of type 'NoneType' is not iterable

(我尝试以几种方式重新安排它,但无济于事。)

通过比较,此代码完全符合预期:

for word in wordlist:
    if 'some_string' in word:
        print ('found')
    else:
        print(word)

我想要的是将包含“ some_string”的任何字符串替换为“ found”。

更多上下文:单词列表是Jupyter笔记本中Pandas数据框的一列中的值。

wordlist = list(df.sender.values)
type(wordlist)
 list

3 个答案:

答案 0 :(得分:2)

您可以通过简单地使用“ str()”来实现从列表中恢复的值的比较来解决此问题。

下面是一个演示此情况的示例:

wordlist = ['some_string', 'sometext', 'some_string', 'randomtext', None]
['found' if 'some_string' in str(word) else word for word in wordlist]

输出为

['found', 'sometext', 'found', 'randomtext', None]

(要产生错误,请在理解内将str(word)替换为word。)

答案 1 :(得分:1)

您的单词表中有None个值。 遇到第一个错误时,将引发错误。 Python无法迭代None类型,但是它需要开始迭代才能发现变量中是否包含字符串。

答案 2 :(得分:1)

将您的列表理解更改为:

output = ['found' if (word and 'some_string' in word) else word for word in wordlist]

此处的关键点是if word。问题是数据框中有一些None元素,这会影响迭代。 我认为这与unicode元素无关