如果您可以建议我如何编写脚本以按值的数量拆分列表,我的意思是:
my_list =[11,11,11,11,12,12,15,15,15,15,15,15,20,20,20]
Run Code Online (Sandbox Code Playgroud)
并且有 11-4,12-2,15-6,20-3 项。因此,在 exsample range(0:100) 的下一个列表中,我必须拆分为 4,2,6,3 部分所以我为拆分列表计算了相同的值和函数,但它不适用于列表:
div=Counter(my_list).values() ##counts same values in the list
def chunk(it, size):
it = iter(it)
return iter(lambda: tuple(islice(it, size)), ())
Run Code Online (Sandbox Code Playgroud)
我需要什么:
Out: ([0,1,2,3],[4,5],[6,7,8,9,10,11], etc...]
Run Code Online (Sandbox Code Playgroud)
您可以使用enumerate,itertools.groupby以及operator.itemgetter:
In [45]: import itertools
In [46]: import operator
In [47]: [[e[0] for e in d[1]] for d in itertools.groupby(enumerate(my_list), key=operator.itemgetter(1))]
Out[47]: [[0, 1, 2, 3], [4, 5], [6, 7, 8, 9, 10, 11], [12, 13, 14]]
Run Code Online (Sandbox Code Playgroud)
它的作用如下:
首先它枚举项目。
它使用每个枚举元组中的第二项(原始值)对它们进行分组。
在每个组的结果列表中,它使用每个元组中的第一项(枚举)
Python 3 中的解决方案,如果您只使用counter:
from collections import Counter
my_list =[11,11,11,11,12,12,15,15,15,15,15,15,20,20,20]
count = Counter(my_list)
div= list(count.keys()) # take only keys
div.sort()
l = []
num = 0
for i in div:
t = []
for j in range(count[i]): # loop number of times it occurs in the list
t.append(num)
num+=1
l.append(t)
print(l)
Run Code Online (Sandbox Code Playgroud)
输出:
[[0, 1, 2, 3], [4, 5], [6, 7, 8, 9, 10, 11], [12, 13, 14]]
Run Code Online (Sandbox Code Playgroud)
使用替代解决方案set:
my_list =[11,11,11,11,12,12,15,15,15,15,15,15,20,20,20]
val = set(my_list) # filter only unique elements
ans = []
num = 0
for i in val:
temp = []
for j in range(my_list.count(i)): # loop till number of occurrence of each unique element
temp.append(num)
num+=1
ans.append(temp)
print(ans)
Run Code Online (Sandbox Code Playgroud)
编辑: 根据 @Protoss Reed 评论中提到的获得所需输出所需的更改
my_list =[11,11,11,11,12,12,15,15,15,15,15,15,20,20,20]
val = list(set(my_list)) # filter only unique elements
val.sort() # because set is not sorted by default
ans = []
index = 0
l2 = [54,21,12,45,78,41,235,7,10,4,1,1,897,5,79]
for i in val:
temp = []
for j in range(my_list.count(i)): # loop till number of occurrence of each unique element
temp.append(l2[index])
index+=1
ans.append(temp)
print(ans)
Run Code Online (Sandbox Code Playgroud)
输出:
[[54, 21, 12, 45], [78, 41], [235, 7, 10, 4, 1, 1], [897, 5, 79]]
Run Code Online (Sandbox Code Playgroud)
这里我必须转换set成,list因为set没有排序,我认为剩余是不言自明的。
如果输入不总是排序的另一个解决方案OrderedDict(使用):
from collections import OrderedDict
v = OrderedDict({})
my_list=[12,12,11,11,11,11,20,20,20,15,15,15,15,15,15]
l2 = [54,21,12,45,78,41,235,7,10,4,1,1,897,5,79]
for i in my_list: # maintain count in dict
if i in v:
v[i]+=1
else:
v[i]=1
ans =[]
index = 0
for key,values in v.items():
temp = []
for j in range(values):
temp.append(l2[index])
index+=1
ans.append(temp)
print(ans)
Run Code Online (Sandbox Code Playgroud)
输出:
[[54, 21], [12, 45, 78, 41], [235, 7, 10], [4, 1, 1, 897, 5, 79]]
Run Code Online (Sandbox Code Playgroud)
在这里,我用来OrderedDict维护输入序列的顺序,在 的情况下,该顺序是随机的(不可预测的)set。
虽然我更喜欢@Ami Tavory 的解决方案,它更Pythonic。
[额外的工作:如果任何人都可以将此解决方案转换为list comprehension它,那就太棒了,因为我尝试过但无法将其转换为list comprehension,如果你成功,请将其发布在评论中,这将帮助我理解]