我正尝试在 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(所有三个都不同)。对于索引一,它是 2(因为 'cut' 出现了两次),而在索引二中,它又是 3。同样,我需要对 mylist 的所有列表重复该过程。
感觉我被困在这里了。有人可以建议我一个合适的方法,也许是列表理解?
谢谢。
最佳答案
您可以使用 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]
关于Python:列表比较以查找列表的唯一元素计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21601929/