用分隔符拆分列表元素 | “无法将 'list' 对象隐式转换为 str”错误 (Python)

Splitting a list element by a separator | 'Can't convert 'list' object to str implicitly' error (Python)

我有一个列表json_data:

> print(json_data)
> ['abc', 'bcd/chg', 'sdf', 'bvd', 'wer/ewe', 'sbc & osc']

我需要将带有“/”、“&”或 'and' 的元素拆分为两个不同的元素。我正在寻找的结果应该是这样的:

>['abc', 'bcd', 'chg', 'sdf', 'bvd', 'wer', 'ewe', 'sbc' , 'osc']

密码是:

separators = ['/', 'and', '&']

titles = []
for i in json_data:
    titles.extend([t.strip() for t in i.split(separators)
                  if i.strip() != ''])

当 运行 它时,我得到一个错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-15-d0db85078f05> in <module>()
      5 titles = []
      6 for i in json_data:
----> 7     titles.extend([t.strip() for t in i.split(separators)
      8                   if i.strip() != ''])

TypeError: Can't convert 'list' object to str implicitly

如何解决这个问题?

我相信您在列表理解中寻找的是

[t.strip() for separator in separators for t in i.split(separator) if i.strip() != '']

Python 没有按分隔符列表自动分隔。

问题出现在 i.split(separators) 中,其中对 split 的调用期望一个字符串拆分 i,但得到一个 list字符串。 您可以尝试使用另一个 for 循环,遍历您的分隔符,并以此拆分 i

编辑:您最好查看@Uriel 的回答,这是更 Pythonic 的方式!

正则表达式是你的朋友:

>>> import re
>>> pat = re.compile("[/&]|and")
>>> json_data = ['abc', 'bcd/chg', 'sdf', 'bvd', 'wer/ewe', 'sbc & osc']
>>> titles = []
>>> for i in json_data:
...   titles.extend([x.strip() for x in pat.split(i)])
... 
>>> titles
['abc', 'bcd', 'chg', 'sdf', 'bvd', 'wer', 'ewe', 'sbc', 'osc']

这行噪音:re.compile("[/&]|and") 表示 "create a regular expression matching either [/&] or the word 'and'"。 [/&] 当然匹配 /&。 有了它,pat.split(i) 就将字符串 i 拆分为任何匹配 pat 的内容。

后期编辑: 意识到我们当然可以通过稍微复杂化正则表达式来跳过 strip() 步骤。如果我们有正则表达式 "\s[/&]\s|\sand\s" 那么我们当然会匹配基本匹配元素之前或之后的任何空格。这意味着在这个模式上拆分会删除多余的空格,此外它还可以防止我们在像 "sandwich" 这样的单词中间拆分,如果它恰好出现在我们的数据中:

>>> pat = re.compile("\s[/&]\s|\sand\s")
>>> pat.split("beans and rice and sandwiches")
['beans', 'rice', 'sandwiches']
>>> 

这简化了列表的构造,因为我们不再需要从拆分结果中去除空白,顺便说一句,这为我们节省了一些循环。给定新的模式,我们可以这样写:

>>> titles = []
>>> for i in json_data:
...   titles.extend(pat.split(i))
... 
json_data = ["abc", "bcd/chg", "sdf", "bvd", "wer/ewe", "sbc & osc"]
separators = ['/', '&', 'and']
title = []

for i in json_data:
    k = 0
    while k < len(separators):
        if separators[k] in i:
            t = i.split(separators[k])
            title.extend(t)
            break
        else:
            k += 1
        if k == 3:
            title.append(i)
print(title)