用分隔符拆分列表元素 | “无法将 '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)
我有一个列表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)