迭代拆分列表元素
split list elements iteratively
我想拆分列表 names
元素。更准确地说,我只想用 Oscar Muller
拆分字符串
names = ['Oscar Muller Some other Name', 'Oscar Muller', 'Peter Pan']
expected_names = ['Oscar Muller', 'Some other Name', 'Oscar Muller', 'Peter Pan']
d = "Oscar Muller "
for line in names:
s = [e+d for e in line.split(d) if e]
那没有做任何事情。
[list(filter(None, re.split(r'Oscar\sMuller\s', i))) for i in names]
也没做什么。
d1 = re.compile(r"Oscar\sMuller\s")
d = d1.search(names)
for line in names:
if d:
s = [e+d for e in line.split(d) if e]
但它导致了输入问题 .split()
。错误:TypeError: must be str or None, not re.Pattern
。所以我将其更改为处理每个列表元素。
d1 = re.compile(r"Oscar\sMuller\s")
d = list(filter(d1.match, names))
for line in names:
if d:
s = [e+d for e in line.split(d) if e]
但是也没用,返回TypeError: must be str or None, not list
问题:我做错了什么?
本质上,您需要做的是为原始列表中的每个项目生成 1 或 2 个项目子列表,然后将列表展平为单个可迭代对象。
有几种方法可以做到这一点。您可以使用生成器函数,或者巧妙地使用 itertools
import re
def my_generator(names):
for name in names:
sublist = re.split(r"(?<=Oscar Muller) ", name)
yield from sublist
names = ['Oscar Muller Some other Name', 'Oscar Muller', 'Peter Pan']
expected_names = list(my_generator(names))
或者您可以 one-liner itertools
:
import itertools
import re
names = ['Oscar Muller Some other Name', 'Oscar Muller', 'Peter Pan']
expected_names = list(itertools.chain.from_iterable(re.split(r"(?<=Oscar Muller) ", s) for s in names))
您也可以使用列表理解使其成为一行:
import re
[j for i in [re.split(r"(?<=Oscar Muller)", k) for k in names] for j in i if j]
我想拆分列表 names
元素。更准确地说,我只想用 Oscar Muller
names = ['Oscar Muller Some other Name', 'Oscar Muller', 'Peter Pan']
expected_names = ['Oscar Muller', 'Some other Name', 'Oscar Muller', 'Peter Pan']
d = "Oscar Muller "
for line in names:
s = [e+d for e in line.split(d) if e]
那没有做任何事情。
[list(filter(None, re.split(r'Oscar\sMuller\s', i))) for i in names]
也没做什么。
d1 = re.compile(r"Oscar\sMuller\s")
d = d1.search(names)
for line in names:
if d:
s = [e+d for e in line.split(d) if e]
但它导致了输入问题 .split()
。错误:TypeError: must be str or None, not re.Pattern
。所以我将其更改为处理每个列表元素。
d1 = re.compile(r"Oscar\sMuller\s")
d = list(filter(d1.match, names))
for line in names:
if d:
s = [e+d for e in line.split(d) if e]
但是也没用,返回TypeError: must be str or None, not list
问题:我做错了什么?
本质上,您需要做的是为原始列表中的每个项目生成 1 或 2 个项目子列表,然后将列表展平为单个可迭代对象。
有几种方法可以做到这一点。您可以使用生成器函数,或者巧妙地使用 itertools
import re
def my_generator(names):
for name in names:
sublist = re.split(r"(?<=Oscar Muller) ", name)
yield from sublist
names = ['Oscar Muller Some other Name', 'Oscar Muller', 'Peter Pan']
expected_names = list(my_generator(names))
或者您可以 one-liner itertools
:
import itertools
import re
names = ['Oscar Muller Some other Name', 'Oscar Muller', 'Peter Pan']
expected_names = list(itertools.chain.from_iterable(re.split(r"(?<=Oscar Muller) ", s) for s in names))
您也可以使用列表理解使其成为一行:
import re
[j for i in [re.split(r"(?<=Oscar Muller)", k) for k in names] for j in i if j]