在python中分类列表的元素

时间:2018-07-24 09:04:45

标签: python python-2.7 list categories

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

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

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

2 个答案:

答案 0 :(得分:4)

假设该函数具有传递性和反射性(如果不是,则整个分组似乎没有多大意义),将每个单词与每个组中的一个“代表”进行比较就足够了,例如仅第一个或最后一个元素。如果不存在这样的组,请创建一个新组,例如使用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是组数。如果您有一个函数areTheSame(x,y)而不是getGroup(x),那么您将得到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: ['lengths']}

答案 1 :(得分:1)

我相信您可以使用itertools groupby函数,但可能需要修改var data = [{ "type": "radar", "detail": [{ "subject": "sub1" }, { "subject": "sub2" }] }, { "type": "bar", "detail": [{ "subject": "sub1" }, { "subject": "sub2" }] }] if (data.some(val => val.type == "bar")) console.log("Equal") else console.log("No record found");函数,以便将其用作按键功能,即会产生某种按键。

areTheSame