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
的超级粉丝,别误会我!