鱼C论坛

 找回密码
 立即注册
查看: 3652|回复: 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 | 显示全部楼层
from itertools import groupby
def groups(lst,new = []):
        for k,v in groupby(lst):
                l = len(list(v))
                new.extend([k,l] if l>1 else [k])
        return new

点评

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

评分

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

查看全部评分

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

使用道具 举报

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

s = [1, 2, 2, 2, 1, 1, 3, 3, 3, 3, 2, 1, 1]
ns = []
gs = ['']
for k, v in groupby(s):
    gs[0] = list(v)
    if len(gs[0]) > 1:
        ns.append(k)
        ns.append(len(gs[0]))
    else:
        ns.append(k)

print(ns)

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-9-30 11:03:58 | 显示全部楼层
in_num = input("请输入一个数字列表:")
new_num = []
temp = 1
for i in range(len(in_num)-1):
    if int(in_num[i]) - int(in_num[i+1]) == 0:
        temp += 1
        continue
    else:
        new_num.append(in_num[i])
        if temp > 1:
            new_num.append(temp)
        temp = 1
new_num.append(in_num[i+1])
if temp > 1:
    new_num.append(temp)
print(new_num)

点评

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

使用道具 举报

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

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-9-30 14:42:59 | 显示全部楼层
list1 = [1, 2, 2, 2, 1, 1, 3, 3, 3, 3, 2, 1, 1]
new_list = []
n = 1
for i in range(len(list1)):
    if i != 12 and list1[i] != list1[i+1] or i ==12:
        if n == 1:
            new_list.append(list1[i])
        else:
            new_list.append(list1[i])
            new_list.append(n)
            n = 1
    else:
        n += 1
print(new_list)

评分

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

查看全部评分

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

使用道具 举报

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

使用道具 举报

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

def fun(lst):
    a = [(i, len(list(j))) for i,j in groupby(lst)]
    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 | 显示全部楼层
考虑到列表中所有元素相同的情况
list1 = [1, 2, 2, 2, 1, 1, 3, 3, 3, 3, 2, 1, 1]
list2 = []

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

    if list1[i+1] == list1[i]:
        count += 1
    else:
        list2.append(list1[i])
        if count != 0:
            list2.append(count+1)
            count = 0


sign = 0
if list1[-1] == list1[-2]:
    for i in range(-1,-len(list1),-1):
        if list1[i] != list1[i-1]:
            list2.append(list1[-1])
            list2.append(-i)
            sign = 1
            break
else:
    list2.append(list1[-1])
    
if sign == 0:
    list2.append(list1[1])
    list2.append(len(list1))
            
print(list2)

评分

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

查看全部评分

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

使用道具 举报

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

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

使用道具 举报

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

def group_by(list_x):
    result = []
    for a,b in groupby(list_x):
        result.append(a)
        l = len(list(b))
        if l > 1:
            result.append(l)
    return result

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

使用道具 举报

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

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

print(newList(a))

>>> 
[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 | 显示全部楼层
def func(lis):
        t=None;l=1;re=[]
        for i in lis:
                if i==t:l+=1
                else:
                        if l!=1:re.append(l)
                        l=1;t=i;re.append(i)
        if l!=1:re.append(l)
        return re
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-8 13:09:47 | 显示全部楼层
def fun107(nums):
    ans = []
    pre, cout = -1, 0
    for num in nums:
        if num == pre:
            cout += 1
        else:
            if cout > 1:
                ans.append(cout)
            ans.append(num)
            pre, cout = num, 1
            
    if cout > 1:
        ans.append(cout)
        
    return ans       
            

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, 2025-1-12 03:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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