如果列表包含任何列表,则返回匹配字符串

2024-10-04 09:31:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个新列来比较两个列表并返回匹配的字符串

我不断得到错误“'list'对象没有'find'属性”

我仍然是一个新手在这方面,所以任何帮助将非常感谢

我试着用Python和熊猫来做这个

到目前为止我所知道的是

raw = pd.read_csv(r"")
brandnames = ['Amana','Maytag']

raw['Brands'] = [k for k in raw['Description'] if brandnames.find(k)]

raw.head()

我希望最终的结果是有一个新的列命名为品牌,说'阿曼娜'时,描述列包含的话'阿曼娜'

非常感谢


Tags: csv对象字符串列表readraw属性错误
2条回答

我不明白为什么你会感到困惑。find文档清楚地说明了它是一个字符串方法,而不是列表方法。此外,它还返回一个索引。您已经发明了一个find方法,它返回一个布尔值,是类list的新元素

我想你想要的是

[k for k in raw['Description'] if k in brandnames]

更直接地说,你可以通过设置交集来实现。将两个名称列表转换为集合,取交叉点,然后转换为列表

list(set(raw['Description']) * set(brandnames))

列表类型(brandnames)中没有“find”方法或属性,因此Python抛出了一个错误。要快速检查类型中可用的属性和方法,可以使用dir(),例如:

>>> x = ['abc', 'def']
>>> dir(x)
['__add__', '__class__', '__contains__', '__delattr__', ...

你可能想要的是Prune答案中的in操作符。值得考虑的一点是in只会返回True,如果找到一个精确的匹配:

>>> brandnames = ['Amana', 'Maytag']
>>> 'Amana' in brandnames
True
>>> 'Amana ' in brandnames
False
>>> 'amana' in brandnames
False
>>> 'Amanaa' in brandnames
False

另一件需要考虑的事情是,在对pd.read_csv返回的结果使用in运算符之前,可能需要对其进行额外的更改

>>> some_data = "foo bar baz Maytag"
>>> [i for i in some_data.split(' ') if i in brandnames]
['Maytag']

在程序中对raw调用type()可能有用,但如果不行,我建议您查看一下Pandas文档

相关问题 更多 >