鱼C论坛

 找回密码
 立即注册
查看: 3239|回复: 18

[技术交流] Python:每日一题 107

[复制链接]
发表于 2017-9-30 09:07:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬雪雪冬 于 2017-10-1 22:28 编辑

首先我们的玩法做了一下改变:
1. 楼主不再提供答案。
2. 为了让大家独立思考,跟帖改为“回帖仅作者可见”。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
将一个由数字组成的列表,生成一个新列表,要求,如果有连续的相同数字,则只取一个,并在后面加上一个新元素--一个数字,表示相同数字的个数,其他数字照抄。
例如:
[1, 2, 2, 2, 1, 1, 3, 3, 3, 3, 2, 1, 1]
第0个元素为1,则新列表照抄,第1~3元素为2,则新列表中写2, 3,以此类推得到新列表:
[1, 2, 3, 1, 2, 3, 4, 2, 1, 2]

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-30 10:11:43 | 显示全部楼层
  1. from itertools import groupby
  2. def groups(lst,new = []):
  3.         for k,v in groupby(lst):
  4.                 l = len(list(v))
  5.                 new.extend([k,l] if l>1 else [k])
  6.         return new
复制代码

点评

尽量不要给函数形参指定可变对象作为默认值。"new = []" 会有一些坑~ ; [] 是在函数定义域之外绑定的。  发表于 2017-9-30 11:13

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-9-30 10:43:28 | 显示全部楼层
  1. from itertools import groupby

  2. s = [1, 2, 2, 2, 1, 1, 3, 3, 3, 3, 2, 1, 1]
  3. ns = []
  4. gs = ['']
  5. for k, v in groupby(s):
  6.     gs[0] = list(v)
  7.     if len(gs[0]) > 1:
  8.         ns.append(k)
  9.         ns.append(len(gs[0]))
  10.     else:
  11.         ns.append(k)

  12. print(ns)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-30 11:03:58 | 显示全部楼层
  1. in_num = input("请输入一个数字列表:")
  2. new_num = []
  3. temp = 1
  4. for i in range(len(in_num)-1):
  5.     if int(in_num[i]) - int(in_num[i+1]) == 0:
  6.         temp += 1
  7.         continue
  8.     else:
  9.         new_num.append(in_num[i])
  10.         if temp > 1:
  11.             new_num.append(temp)
  12.         temp = 1
  13. new_num.append(in_num[i+1])
  14. if temp > 1:
  15.     new_num.append(temp)
  16. print(new_num)
复制代码

点评

01行怎样得到一个列表?  发表于 2017-10-1 22:32
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-30 11:48:41 | 显示全部楼层
  1. >>> from itertools import groupby
  2. >>> from tkinter import _flatten as fltn
  3. >>> a=[1, 2, 2, 2, 1, 1, 3, 3, 3, 3, 2, 1, 1]
  4. >>> fltn([(k,(k,v))[v>1]for k,v in((k,len(list(v)))for k,v in groupby(a))])
  5. (1, 2, 3, 1, 2, 3, 4, 2, 1, 2)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-30 14:42:59 | 显示全部楼层
  1. list1 = [1, 2, 2, 2, 1, 1, 3, 3, 3, 3, 2, 1, 1]
  2. new_list = []
  3. n = 1
  4. for i in range(len(list1)):
  5.     if i != 12 and list1[i] != list1[i+1] or i ==12:
  6.         if n == 1:
  7.             new_list.append(list1[i])
  8.         else:
  9.             new_list.append(list1[i])
  10.             new_list.append(n)
  11.             n = 1
  12.     else:
  13.         n += 1
  14. print(new_list)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-30 14:49:49 | 显示全部楼层
本帖最后由 SixPy 于 2017-9-30 15:17 编辑
  1. from itertools import groupby
  2. a=[1, 2, 2, 2, 1, 1, 3, 3, 3, 3, 2, 1, 1]
  3. print([n for i,n in enumerate(
  4.          sum(([k,len(list(g))]for k,g in groupby(a)),[])
  5.          ,1)if i&1|n-1])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-30 20:19:32 | 显示全部楼层
分组,取长度,判断,输出
  1. from itertools import groupby

  2. def fun(lst):
  3.     a = [(i, len(list(j))) for i,j in groupby(lst)]
  4.     return [i for k in a for i,j in zip(k, range(2)) if i!=1 or j!=1]
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-30 23:21:16 | 显示全部楼层
def new(list1):
       list2  =  [ ]
       k = 0
       for i in range(k,len(list1)):
              if list1[k]==list1[i]:
                  continue
              else:
                 list2.append(list1[k])
                 list2.append(i-k)
                 k = i
        print(list2)
#手机打的现无电脑验证本人初学者,请指教

点评

不正确  发表于 2017-10-1 22:39
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-1 19:27:02 | 显示全部楼层
考虑到列表中所有元素相同的情况
  1. list1 = [1, 2, 2, 2, 1, 1, 3, 3, 3, 3, 2, 1, 1]
  2. list2 = []

  3. count = 0
  4. for i in range(len(list1)-1):

  5.     if list1[i+1] == list1[i]:
  6.         count += 1
  7.     else:
  8.         list2.append(list1[i])
  9.         if count != 0:
  10.             list2.append(count+1)
  11.             count = 0


  12. sign = 0
  13. if list1[-1] == list1[-2]:
  14.     for i in range(-1,-len(list1),-1):
  15.         if list1[i] != list1[i-1]:
  16.             list2.append(list1[-1])
  17.             list2.append(-i)
  18.             sign = 1
  19.             break
  20. else:
  21.     list2.append(list1[-1])
  22.    
  23. if sign == 0:
  24.     list2.append(list1[1])
  25.     list2.append(len(list1))
  26.             
  27. print(list2)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-2 09:33:20 | 显示全部楼层

输入时作为一个字符串输入了,并没有作为列表输入,审题有误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-26 10:23:36 | 显示全部楼层
  1. from itertools import groupby

  2. def group_by(list_x):
  3.     result = []
  4.     for a,b in groupby(list_x):
  5.         result.append(a)
  6.         l = len(list(b))
  7.         if l > 1:
  8.             result.append(l)
  9.     return result

  10. if __name__ == '__main__':
  11.     print(group_by([1, 2, 2, 2, 1, 1, 3, 3, 3, 3, 2, 1, 1]))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-2 03:41:58 | 显示全部楼层
  1. a = [1, 2, 2, 2, 1, 1, 3, 3, 3, 3, 2, 1, 1]

  2.         
  3. def newList(lst):
  4.     result = [lst[0]] # 第一个元素比然放进去
  5.     count = 1         # 第一个元素至少1个
  6.     for index in range(1, len(lst)):
  7.         if lst[index] == lst[index-1]:
  8.             count += 1    # 如果和前面数字相同则个数加1
  9.             if index == len(lst)-1: # 因为最后一个元素后面没有数字可以比较
  10.                 result.append(count) # 需要手动将个数加入result
  11.         else:
  12.             if count > 1: # 如果个数大于1个则加入个数,否则照抄
  13.                 result.append(count)
  14.             result.append(lst[index]) # 如果和前面的数字不同,重新开始计数
  15.             count = 1
  16.     return result

  17. print(newList(a))

  18. >>>
  19. [1, 2, 3, 1, 2, 3, 4, 2, 1, 2]

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-28 08:15:37 | 显示全部楼层
def fun(num_list):
    list1 = []
    k = 0
    while k < len(num_list)
        num = 1
        j = num_list[k]
        for i in range(k+1,len(num_list)):
            k = i-1
            if j == num_list[i]:
                num += 1
            else:
                break
        if num == 1:
            list1.append(num_list[k])
        else:
            list1.extend([num_list[k], num])
        print(list1)
        pass
num_list = [1, 2, 2, 2, 1, 1, 3, 3, 3, 3, 2, 1, 1]
fun(num_list)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-18 18:06:06 | 显示全部楼层
  1. def func(lis):
  2.         t=None;l=1;re=[]
  3.         for i in lis:
  4.                 if i==t:l+=1
  5.                 else:
  6.                         if l!=1:re.append(l)
  7.                         l=1;t=i;re.append(i)
  8.         if l!=1:re.append(l)
  9.         return re
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-8 13:09:47 | 显示全部楼层
  1. def fun107(nums):
  2.     ans = []
  3.     pre, cout = -1, 0
  4.     for num in nums:
  5.         if num == pre:
  6.             cout += 1
  7.         else:
  8.             if cout > 1:
  9.                 ans.append(cout)
  10.             ans.append(num)
  11.             pre, cout = num, 1
  12.             
  13.     if cout > 1:
  14.         ans.append(cout)
  15.         
  16.     return ans      
  17.             

  18. print(fun107([1, 2, 2, 2, 1, 1, 3, 3, 3, 3, 2, 1, 1]))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 10:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表