合并Python列表中的条目

时间:2017-11-08 19:47:01

标签: python algorithm list

假设我有一个列表test = ['a','b','b','b','a','b','a','a','b','b']。如果我想将所有相邻的'b'组合在一起得到test2 = ['a','b','a','b','a','a','b'],那么最有效和最优雅的方法是什么?

3 个答案:

答案 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)