python - 在python中对列表的元素进行分类

标签 python python-2.7 list categories

我想有效地对给定列表 L1 的元素进行分类。此列表可以任意长,因此我正在寻找一种有效的方法来执行以下操作。

列表 L1 包含多个元素 [e_1,...,e_N] 可以与名为 areTheSame(e1,e2) 的通用函数进行比较。如果此函数返回 True,则表示两个元素属于同一类别。

最后,我想要另一个列表 L2,它又包含不同的列表 [LC_1, ..., LC_M]。每个 LC 列表包含同一类别的所有元素。

最佳答案

假设函数是传递和反射的(如果不是,整个分组似乎没有多大意义),将每个词与每个组中的一个“代表”进行比较就足够了,例如只是第一个或最后一个元素。如果不存在这样的组,则创建一个新组,例如使用带有空列表的 next 作为默认元素。

lst = "a list with some words with different lengths".split()
areTheSame = lambda x, y: len(x) == len(y)
res = []
for w in lst:
    l = next((x for x in res if areTheSame(w, x[0])), [])
    if l == []:
        res.append(l)
    l.append(w)

结果:[['a'], ['list', 'with', 'some', 'with'], ['words'], ['different'], ['lengths'] ]

尽管如此,这仍然具有 O(n*k) 的复杂度,其中 n 是单词的数量,k 是组的数量。如果您使用函数 getGroup(x) 而不是 areTheSame(x,y) 会更高效,那么您将拥有 O(n)。也就是说,该函数不是测试两个元素是否属于同一组,而是提取确定该元素属于哪个组的属性。在我的例子中,这只是字符串的 len,但在你的例子中它可能更复杂。

getGroup = lambda x: len(x)
d = collections.defaultdict(list)
for w in lst:
    d[getGroup(w)].append(w)

结果:{1: ['a'], 4: ['list', 'with', 'some', 'with'], 5: ['words'], 9: ['different '], 7: ['长度']}

关于python - 在python中对列表的元素进行分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51494675/

相关文章:

algorithm - 对来自不同来源的实体的排序列表进行分页

python - 如何重新排列这样的列表(python)?

python - 在 Tensorflow 中查找方法的实现

python - 如何访问另一个对象内部的对象的方法

python - 分解高度分支的解析器的大多数 pythonic 方法

python-2.7 - Python从数据中删除异常值

python - 将列表随机划分为两个互补的子列表

python - pyomo环境下添加约束

python - 在 Mac OS 10.6 上安装 virtualenv 时出错

html - 如何使用 css 隐藏列表并在鼠标位于上方时显示它?