如果列表元素包含任何值,我想分隔列表元素
list_operators = ['+', '-', '*', '(', ')']
不会从列表中丢失运算符,也不会使用正则表达式。
例如:
my_list = ['a', '=', 'x+y*z', '//', 'moo']
想要的输出:
['a', '=', 'x', '+', 'y', '*', 'z', '//', 'moo']
和 x y z 是单词而不是一个字符:
['john+doe/12*5']
['john','+','doe','/','12','*','5']
最佳答案
您可以使用 itertools.groupby()
来实现此目的:
from itertools import groupby
operators = {'+', '-', '*', '(', ')'}
fragments = ['a', '=', 'x+y*z', '//', 'moo', '-', 'spam*(eggs-ham)']
separated = []
for fragment in fragments:
for is_operator, group in groupby(fragment, lambda c: c in operators):
if is_operator:
separated.extend(group)
else:
separated.append(''.join(group))
>>> separated
['a', '=', 'x', '+', 'y', '*', 'z', '//', 'moo', '-',
'spam', '*', '(', 'eggs', '-', 'ham', ')']
请注意,我已经将变量的名称更改为更有意义,并将 operators
设置为一组,因为我们只关心成员身份,而不关心顺序(尽管代码也可以工作,如果慢一点的话) ,带有列表)。
groupby()
返回 (key, group)
对的可迭代对象,每当 key
发生变化时就开始一个新组。由于我选择了一个关键函数 ( lambda c: c in operators
),该函数仅测试 operators
中角色的成员资格,因此 groupby()
调用的结果如下所示:
[
(False, ['s', 'p', 'a', 'm']),
(True, ['*', '(']),
(False, ['e', 'g', 'g', 's']),
(True, ['-']),
(False, ['h', 'a', 'm']),
(True, [')'])
]
( groupby()
实际上返回一个由 groupby object
(key,
grouper object
元组组成的 )
- 为了清楚起见,我已将这些对象转换为上面示例中的列表)。
其余代码很简单:如果 is_operator
是 True
,则 group
中的字符用于扩展 separated
;如果是 False
,则 group
中的字符将重新连接回字符串并附加到 separated
。
关于python - 使用许多分隔符分隔字符串(列表元素),而不会丢失列表中的碎片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26518759/