Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中对列表的元素进行分类_Python_Python 2.7_List_Categories - Fatal编程技术网

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

在python中对列表的元素进行分类,python,python-2.7,list,categories,Python,Python 2.7,List,Categories,我想有效地对给定列表的元素进行分类L1。这个列表可以是任意长的,所以我正在寻找一种有效的方法来完成以下工作 列表L1包含几个元素[e_1,…,e_N],这些元素可以与名为的通用函数进行比较,它们是相同的(e1,e2)。如果此函数返回True,则表示两个元素属于同一类别 最后,我想要另一个列表L2,它依次包含不同的列表[LC_1,…,LC_M]。每个LC列表包含同一类别的所有元素。我相信您可以使用函数,但可能需要修改相同的函数,使其成为一个keyfunc,即产生某种键 L1 = sorted(L1

我想有效地对给定列表的元素进行分类
L1
。这个列表可以是任意长的,所以我正在寻找一种有效的方法来完成以下工作

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

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

我相信您可以使用函数,但可能需要修改相同的
函数,使其成为一个keyfunc,即产生某种键

L1 = sorted(L1, key=keyfunc)
L2 = [list(g) for _, g in groupby(L1, keyfunc))

假设函数是可传递和反射的(如果不是,整个分组似乎没有多大意义),将每个单词与每个组中的一个“代表性”进行比较就足够了,例如,仅比较第一个或最后一个元素。如果不存在此类组,则创建一个新组,例如使用空列表作为默认元素的
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)
结果:

尽管如此,这仍然具有复杂性O(n*k),其中n是单词的数量,k是组的数量。如果您有一个函数
getGroup(x)
,而不是
相同的(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:['length']}

我认为你可以用O(N**2)时间来完成,首先找到唯一的元素,然后在下一个循环中在其上附加相同的类别。如果
是相同的
传递的和反射的?也就是说,将每个元素与每个组的任何一个代表进行比较就足够了,以确保它是否属于该组?可能很难将相同的
转换为键函数。根据函数的不同,可能会有所帮助,但我认为只有当函数返回
0
-1/+1
而不是
True
False
时,这才有效。太好了!我没有得到
getGroup(x)
所能得到的do@user3473823在我的示例中,
getGroup(x)
只返回字符串的
len
。不过,很难说在您的案例中是否存在这样一个关键功能。可以把它想象成某种散列函数,其中任何组中的每个元素的散列都是相同的。我认为
getGroup(x)
函数在我的例子中并不存在。此外,我还有处理不可损坏元素的问题,因此它们不能用作
d
字典中的键。@user3473823如果它们不能用作键,您可以使用列表列表而不是dict,然后与该列表中的第一个或最后一个元素进行比较,或者如果没有匹配项,则追加一个新列表。关于键/比较函数:你的函数看起来如何,或者它到底做了什么?@user3473823我将第一个版本更改为使用列表列表而不是dict,因为dict在这里没有真正的帮助,这样元素就不必是可散列的。