我正在尝试在Python中为我的一个项目实现字符串比较算法。因为我是python的新手,所以我在旅途中学习。但是我坚持算法的一步。 目前我有列表清单。它按长度排序和分组。
mylist = list(list(i[1]) for i in itertools.groupby(sorted(mylist, key=len), len))
>>> [
[['pat'],['cut'],['rat']],
[['sat','pat'],['cut','pat']],
[['rat','cut','pat'],['put','cut','bat'],['mat','gut','lit']]
[[...]]...
]
如果我们考虑列中的mylist [2]元素,它看起来像这样
mylist[2]
>>> [['rat','cut','pat'],
['put','cut','bat'],
['mat','gut','lit']]
我想比较每一列并返回最常出现的元素数。即在零指数处,它是3(所有三个都不同)。对于索引1,它是2(因为' cut'出现两次),而在索引2中,它再次是3。同样,我需要重复所有mylist列表的过程。
感觉我被困在这里。有人可以建议我一个合适的方法,也许是列表理解?
谢谢。
答案 0 :(得分:2)
您可以使用set
来提取唯一元素,并使用zip(*list_of_list)
作为“转置”列表列表的技巧。试试这个:
lst = [
[['pat'],['cut'],['rat']],
[['sat','pat'],['cut','pat']],
[['rat','cut','pat'],['put','cut','bat'],['mat','gut','lit']]
]
print map(lambda ll: [len(set(l)) for l in zip(*ll)], lst)
输出:
[[3], [2, 1], [3, 2, 3]]
编辑:要获得每个列表的最小值,可以执行以下操作:
print map(lambda ll: min([len(set(l)) for l in zip(*ll)]), lst)
输出:
[3, 1, 2]