我的代码非常简单:
['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
答案 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元素无关