假设我有一个列表test = ['a','b','b','b','a','b','a','a','b','b']
。如果我想将所有相邻的'b'
组合在一起得到test2 = ['a','b','a','b','a','a','b']
,那么最有效和最优雅的方法是什么?
答案 0 :(得分:3)
使用itertools.groupby
,效果如下:
>>> test = ['a','b','b','b','a','b','a','a','b','b']
>>> import itertools
>>> grouped = itertools.groupby(test)
>>> test2 = []
>>> for k, g in grouped:
... if k == 'b':
... test2.append(k)
... else:
... test2.extend(g)
...
>>> test2
['a', 'b', 'a', 'b', 'a', 'a', 'b']
答案 1 :(得分:1)
试试这个基于在python中使用regular expressions(正则表达式)的解决方案:
import re
test = ['a', 'b', 'b', 'b', 'a', 'b', 'a', 'a', 'b', 'b']
test_string = ''.join(test)
test2_string = re.sub(r'(b)\1+', 'b', test_string)
test2 = list(test2_string)
print(test2)
<强>解释强>
1)首先我们“导入re”在python中使用正则表达式 2)然后我们定义列表 3)然后我们将列表转换为字符串 4)然后我们使用“re”模块中的“sub(pattern,repl,string)”函数,该模块在字符串中查找模式并将其替换为“repl” 5)这里的模式是r'(b)\ 1+'(这意味着我们正在寻找相邻的“b”字母组) 6)我们用一个“b”替换每个组 7)“re.sub()”的输出是一个字符串(所以在最后一行我们将输出字符串转换回列表)
Pythonic方式(紧凑模式):
import re
test2 = list(re.sub(r'(b)\1+', 'b', ''.join(test)))
注意:我还计算了我的代码并将其与@ juanpa.arrivillaga建议的代码进行了比较。对于一百万次迭代,我的代码在我的机器上运行大约需要1.73秒。但是,@ juanpa.arrivillaga建议的代码大约需要2.45秒。
祝你好运......
答案 2 :(得分:1)
最有效的方法是通过列表测试的单次传递(虽然传递几次会渐近相同)和最优雅的,但它取决于,在这种情况下,简单的更好我猜:
test = ['a','b','b','b','a','b','a','a','b','b']
test2 = []
for elem in test:
if elem == 'b' and test2 and test2[-1] == 'b':
continue
test2.append(elem)