LeetCodeT1313压缩编码列表

给你一个以行程长度编码压缩的整数列表 nums 。

考虑每对相邻的两个元素 [a, b] = [nums[2*i], nums[2*i+1]] (其中 i >= 0 ),每一对都表示解压后有 a 个值为 b 的元素。

请你返回解压后的列表。

 

示例:

输入:nums = [1,2,3,4]
输出:[2,4,4,4]
解释:第一对 [1,2] 代表着 2 的出现频次为 1,所以生成数组 [2]。
第二对 [3,4] 代表着 4 的出现频次为 3,所以生成数组 [4,4,4]。
最后将它们串联到一起 [2] + [4,4,4,4] = [2,4,4,4]。
 

提示:

2 <= nums.length <= 100
nums.length % 2 == 0
1 <= nums[i] <= 100

 

我的代码: 

1 class Solution(object):
2     def decompressRLElist(self, nums):
3         res = []
4         for i in range(0, len(nums), 2):
5             res.extend([nums[i + 1]] * nums[i])
6 
7         return [([nums[i + 1]] * nums[i]) for i in range(0, len(nums), 2)]

 

 

问题本身比较简单: 从第0个元素开始,每连续的2个元素代表一组数据,如(a,b)这组数据及元素b出现a次,生成这组数据的数组

          即 : arr = [b,b,b,b....]  len(arr) = a 

          然后将他们拼接

 

但在看评论的时候注意到一行代码给出解,特此记录

def decompressRLElist(nums):
    return sum(([b] * a for a, b in zip(nums[::2], nums[1::2])), [])

 

 

初学python,第一次见到这么漂亮的代码,花了1个小时才彻底弄懂,3个问题

 

1.python列表中的[::]特别应用 https://www.cnblogs.com/mxh1099/p/5804064.html
     nums[a:b:c] 代表着将列表中的元素从[a,b)跳步为c,取出对应元素组成列表
     如: nums = [1,2,3,4] nums[::2]即[1,3]
    拓展:nums[::-1]即将列表倒置


2.zip(函数) https://www.runoob.com/python/python-func-zip.html
     本题应用: zip(nums[::2], nums[1::2])
     即zip([1,3,...],[2,4,...]) 将两个列表中对应的元素分别打包成元祖即 (1,2),(3,4)...
     然后for循环a,b分别代表元祖第一和第一个元素
     [b]*a即生成列表 arr: [b,b,b,b...] len(arr) = a


3. sum()函数的特别应用: 将二维列表合并为一维列表
     sum()函数本质是将传入的可迭代对象中每个元素相加
     如sum([1,2,3]) = 6
     sum([1,2,3],4) = 6 + 4 = 10

     那么特殊用法: sum([[列表1],[列表2],[列表3]]],[]) 可以理解为[列表1]+[列表2]+[列表3]+[] = [ 列表1,2,3中的所有元素 ]      注: 列表合并可直接用"+",也可用extend()函数
     即sum(二维列表,[]) 的返回值为 [二维列表所有元素]
     如 arr = [[1,2,3],[4,5,6],[7,8,9]] sum(arr,[]) 的返回值为 [1,2,3,4,5,6,7,8,9]


 

 

 

 

 

 

posted @ 2020-02-03 00:46  散装英语king  阅读(224)  评论(0编辑  收藏  举报