你为什么不换个角度想。您可以将所有内容映射到字典中:
import re
from collections import defaultdict
regex = re.compile('([a-z]+\-)\d(\-[a-z]+)')
t = ["asdf-1-bhd","uuu-2-ggg","asdf-2-bhd","uuu-1-ggg","asdf-3-bhd"]
maps = defaultdict(list)
for x in t:
parts = regex.match(x).groups()
maps[parts[0]+parts[1]].append(x)
输出:
[['asdf-1-bhd', 'asdf-2-bhd', 'asdf-3-bhd'], ['uuu-2-ggg', 'uuu-1-ggg']]
这真的很快,因为您不必将一件事与另一件事进行比较。
编辑:
以不同的方式思考
您最初的方法是遍历每个项目并将它们相互比较。这是过于复杂和不必要的。
让我们考虑一下我的代码做了什么。首先它得到精简版:
"asdf-1-bhd" -> "asdf--bhd"
"uuu-2-ggg" -> "uuu--ggg"
"asdf-2-bhd" -> "asdf--bhd"
"uuu-1-ggg" -> "uuu--ggg"
"asdf-3-bhd" -> "asdf--bhd"
您已经可以开始查看组了,我们还没有比较任何东西!
我们现在做一种反向映射。我们把右边的所有东西都作为键,把左边的任何东西都放在一个列表中,该列表由左边的值映射:
'asdf--bhd' -> ['asdf-1-bhd', 'asdf-2-bhd', 'asdf-3-bhd']
'uuu--ggg' -> ['uuu-2-ggg', 'uuu-1-ggg']
我们的组由它们的共同计算值(键)定义。这适用于任何数量的元素和组。