如果list元素包含
中的任何值,我想分隔列表元素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']
答案 0 :(得分:3)
您可以使用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
。
答案 1 :(得分:0)
这是一种简单的方法:
for x in my_list:
if len(set(list_operators) & set(list(x)))!=0:
for i in list(x):
slist.append(i)
else:
slist.append(x)
slist
['a', '=', 'x', '+', 'y', '*', 'z', '//', 'moo']
答案 2 :(得分:0)
您也可以这样做:
import re
from itertools import chain
list_operators = ['+', '-', '*', '(', ')']
tokenizer = re.compile(r"[{}]|\w+".format("".join(map(re.escape, list_operators))))
my_list = ['a', '=', 'x+y*z', '//', 'moo', 'john+doe/12*5']
parsed = list(chain.from_iterable(map(tokenizer.findall, my_list)))
parsed
结果:
['a', 'x', '+', 'y', '*', 'z', 'moo', 'john', '+', 'doe', '12', '*', '5']