|
20鱼币
本帖最后由 去冰无糖 于 2022-1-26 13:44 编辑
仍在学习排序问题中,我碰到的问题几句话难以表达清楚,故借助一个我自己假想的排序问题来展现,题目如下:
给定一个整数列表nums,其中只包含a,b,c三种元素,即满足len(nums)==nums.count(a)+nums.count(b)+nums.count(c)
a,b,c的数量满足a<=b<=c,返回一个按照b,c,a的顺序排列的列表,即[b,c,a,b,c,a,b,c,a……],若因a,b,c的数量不足以满足b,c,a,则忽略数量不足的元素继续排列。
-----------------------------------------------------------------------------------------------
举例:
nums = [1,1,1,1,2,2,2,3,3],即a = 1,b = 2, c = 3
返回[2,1,3,2,1,3,2,1,1] 第3个2,1,3由于3的数量不足,只排列2,1;第4个2,1,3由于2,3的数量不足,只排列1。
-----------------------------------------------------------------------------------------------
代码要求
1.代码尽可能的精炼,简洁,完全不考虑时间复杂度,空间复杂度那些作为我这个小白暂时还鞭长莫及的领域。我想要的不是任意一种解法,而是通过努力达到一行流的这种方式训练自己对各种思维、方法、函数、参数的理解。
2.就以上述nums = [1,1,1,1,2,2,2,3,3],a = 1,b = 2, c = 3 为例子编写代码即可,我在意的是解法本身及背后的思维。
3.没有其他任何限制,但最好只使用python基本库。
------------------------------------------------------------------------------------------------
先感谢各位大佬的不啬赐教!
我加上注释吧。 import itertools #为了引入zip_longest函数
nums = [1,1,1,1,2,2,2,3,3]
a = 1
b = 2
c = 3
num_a = [a] * nums.count(a) #根据a, b, c的数量建立新的列表
num_b = [b] * nums.count(b)
num_c = [c] * nums.count(c)
new = itertools.zip_longest(num_b, num_c, num_a) #内置函数zip是将多个参数(必须是可迭代的,如列表、元组等)的第一个元素组成一个元素,第二个、第三个依次,直到最短的参数结束为止,改用.zip_longest,是因为它可以以最长的参数为准,不足的用None补齐
new = list(filter(None, sum(new, tuple()))) #sum的一个偏门用法,将子元组拼接到一起,形成一个一维的结构,再用list转换为列表,
print(new)
|
|