python:根据元素值生成子列表

python:根据元素值生成子列表,python,sublist,Python,Sublist,我有一个元素列表,我想从该列表中生成任意数量的子列表。给定子列表的所有元素必须具有来自函数f的相同输出 例如: >>> mylist = [1,2,3,4,5,6] # my list to split into sublist >>> sublists = list() # my sublists >>> def f(e) : # the function used to discriminate the elements ... ret

我有一个元素列表,我想从该列表中生成任意数量的子列表。给定子列表的所有元素必须具有来自函数
f
的相同输出

例如:

>>> mylist = [1,2,3,4,5,6] # my list to split into sublist
>>> sublists = list() # my sublists
>>> def f(e) : # the function used to discriminate the elements
...  return e%2
... 
>>> for ret in [0,1] :
...   sublists.append([e for e in mylist if f(e) == ret])
... 
>>> print(sublists)
[[2, 4, 6], [1, 3, 5]]
这非常有效,但只是因为我知道哪些值
f
可以返回:
0
,或者
1
。所以我可以迭代这些输出值,然后创建子列表

但是如果我事先不知道
f
可以
返回的值怎么办?有没有一个好的蟒蛇式的方法?我希望避免重复查看
mylist
来查看
f
可以在所有元素上输出什么。

您可以使用:

现在只要
f(e)
对于
e
的所有适当值都是可散列的,您就会得到如下输出

defaultdict(<class 'list'>, {0: [2, 4, 6], 1: [1, 3, 5]})
但是请注意,字典并不能保证保持合理的顺序;每个子列表将保持有序,但您可以

[[2, 4, 6], [1, 3, 5]]

在这个例子中


相当于显示
defaultdict
功能的长格式:

out = {}
for e in mylist:
    key = f(e)
    if key not in out:
        out[key] = []
    out[key].append(e)
您可以使用:

现在只要
f(e)
对于
e
的所有适当值都是可散列的,您就会得到如下输出

defaultdict(<class 'list'>, {0: [2, 4, 6], 1: [1, 3, 5]})
但是请注意,字典并不能保证保持合理的顺序;每个子列表将保持有序,但您可以

[[2, 4, 6], [1, 3, 5]]

在这个例子中


相当于显示
defaultdict
功能的长格式:

out = {}
for e in mylist:
    key = f(e)
    if key not in out:
        out[key] = []
    out[key].append(e)
为了多样性:

from itertools import groupby
from operator import itemgetter

mylist = [1, 2, 3, 4, 5, 6] 
f = lambda x: x % 2

zipt = sorted((f(x), x) for x in mylist)

for x, y in groupby(zipt, key=itemgetter(0)):
    print(x, [z[1] for z in y])
印刷品

0 [2, 4, 6]
1 [1, 3, 5]
为了多样性:

from itertools import groupby
from operator import itemgetter

mylist = [1, 2, 3, 4, 5, 6] 
f = lambda x: x % 2

zipt = sorted((f(x), x) for x in mylist)

for x, y in groupby(zipt, key=itemgetter(0)):
    print(x, [z[1] for z in y])
印刷品

0 [2, 4, 6]
1 [1, 3, 5]

@jonrsharpe是的,但它的可读性也很好,不是说
defaultdict
不可读。必须爱
itertools
。它不能做什么?@wheaties我是
itertools
的超级粉丝,别误会我@jonrsharpe是的,但它的可读性也很好,不是说
defaultdict
不可读。必须爱
itertools
。它不能做什么?@wheaties我是
itertools
的超级粉丝,别误会我!