鱼C论坛

 找回密码
 立即注册
查看: 4940|回复: 28

[技术交流] Python:每日一题83(答题领鱼币)

[复制链接]
发表于 2017-8-21 16:42:48 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬雪雪冬 于 2017-8-22 19:23 编辑

题目:
昨天的题目好像有点偏难,大家答题不踊跃,这回来个简单点的。
有两个一维列表,现在要把两个列表合并成一个列表,要求先排第一个列表的第0个元素,再排第二个列表的第0个元素,然后第一个列表的第1个元素,再排第二个列表的第1个元素,以此类推。
如果两个列表的长度不一,则最后再把长的列表的剩余元素直接排在后面,如:
  1. ['A0', 'A1', 'A2', 'A3', 'A4', 'A5']
  2. ['B0', 'B1', 'B2', 'B3', 'B4', 'B5']
复制代码

排成
  1. ['A0', 'B0', 'A1', 'B1', 'A2', 'B2', 'A3', 'B3', 'A4', 'B4', 'A5', 'B5']
复制代码

  1. ['A0', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7']
  2. ['B0', 'B1', 'B2', 'B3']
复制代码

排成
  1. ['A0', 'B0', 'A1', 'B1', 'A2', 'B2', 'A3', 'B3', 'A4', 'A5', 'A6', 'A7']
复制代码

  1. ['A0', 'A1', 'A2']
  2. ['B0', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6']
复制代码

排成
  1. ['A0', 'B0', 'A1', 'B1', 'A2', 'B2', 'B3', 'B4', 'B5', 'B6']
复制代码


写成merge函数,要求参数为2个列表,返回值为一个合并的列表。
游客,如果您要查看本帖隐藏内容请回复


本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2017-8-21 17:47:47 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-8-21 18:05 编辑

写得有点累赘了,而且仅对数字有效,字符的话就会出错,仅供参考。
  1. import numpy as np
  2. def merge(list1, list2):
  3.         maxlen = max(len(list1),len(list2))
  4.         list3 = np.zeros((maxlen,1), dtype='int32')
  5.         list4 = np.zeros((maxlen,1), dtype='int32')
  6.         list3[:len(list1),0] = list1[:]
  7.         list4[:len(list2),0] = list2[:]
  8.         return [i for i in np.concatenate((list3,list4), axis=1).reshape(1,-1)[0] if i !=0]
  9. print(merge([1,2,3,4],[5,6,7]))
复制代码

[1, 5, 2, 6, 3, 7, 4]

字符的话,要改成
  1. import numpy as np
  2. def merge(list1, list2):
  3.         maxlen = max(len(list1),len(list2))
  4.         list3 = np.zeros((maxlen,1), dtype='str')
  5.         list4 = np.zeros((maxlen,1), dtype='str')
  6.         list3[:len(list1),0] = list1[:]
  7.         list4[:len(list2),0] = list2[:]
  8.         return [i for i in np.concatenate((list3,list4), axis=1).reshape(1,-1)[0] if i]
  9. print(merge(['a','b','c','d'],['e','f','g']))
复制代码

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2017-8-21 17:57:58 | 显示全部楼层
jerryxjr1220 发表于 2017-8-21 17:47
写得有点累赘了

[1, 5, 2, 6, 3, 7, 4]

我在repl.it上验证发现如果数据有0则被忽略掉了,应该是08行的判断的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-21 18:02:02 | 显示全部楼层
冬雪雪冬 发表于 2017-8-21 17:57
我在repl.it上验证发现如果数据有0则被忽略掉了,应该是08行的判断的问题。

是的,因为numpy的列表合并必须是维度相同的,所以我按最大维度先建立了全零的空列表,合并后再挑出不是0的项按列表推导式返回。

可能这题用numpy不是最合适,所以仅供参考。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-21 22:34:57 | 显示全部楼层
  1. def merge(list1,list2):
  2.     list3 = []
  3.     a = min(len(list1),len(list2))
  4.     for i in range(a):
  5.         list3.extend([list1[i],list2[i]])

  6.     list3.extend(list1[a:]) if len(list1)>len(list2) else list3.extend(list2[a:])
  7.     return list3
复制代码


不会用转置函数

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-8-22 15:25:12 | 显示全部楼层
def merge(list1,list2):
    list=[]
    maxlist=(len(list1)>=len(list2))and list1 or list2
    losslist=(len(list1)<=len(list2))and list1 or list2
    for i in range(0,len(losslist)):
        list.append(list1[i])
        list.append(list2[i])
    for i in range(len(losslist),len(maxlist)):
        list.append(maxlist[i])
    return list
print merge([1,2,3,5,9,"a",'b'],[2,3,4,8])

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-8-22 19:12:15 | 显示全部楼层
感觉像是等长部分交错,然后接上后面超长部分?
  1. merge = lambda a,b:[i for j in zip(a+[""]*len(b),b+[""]*len(a)) for i in j if i]
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-8-22 19:20:36 | 显示全部楼层
楼主,答案有笔误
  1. NameError: name 'b' is not defined
复制代码

那个应该是 list2 吧

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2017-8-22 19:23:53 | 显示全部楼层
solomonxian 发表于 2017-8-22 19:12
感觉像是等长部分交错,然后接上后面超长部分?

是的,就是这个意思。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-22 19:25:17 | 显示全部楼层
solomonxian 发表于 2017-8-22 19:20
楼主,答案有笔误

那个应该是 list2 吧

感谢指出,当初设计题目时用的是a和b,后来为了更清晰些就改为list1和list2了,这处忘了改了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-22 19:48:09 | 显示全部楼层
  1. import copy


  2. def merge(list1, list2):
  3.     result_list = copy.deepcopy(list1)
  4.     num = 1
  5.     for x in list2:
  6.         result_list.insert(num, x)
  7.         num += 2
  8.     return result_list

  9. list1 = ['A0', 'A1', 'A2']
  10. list2 = ['B0', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6']
  11. print(merge(list1, list2))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-8-23 12:35:16 | 显示全部楼层
天天都在等每日一题,但是为什么82,83都没在今日热门和最新发布中看到呢?这个还是偶然看到了,居然是前天的帖子,还以为前几天没有发新题了呢,82在哪里,现在还没有找到,82,83现在答案还有奖励么?
4444.png
111.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-23 15:09:21 | 显示全部楼层
  1. def merge_list(list0,list1):
  2.    list3 = []   
  3.    i = 0
  4.    len0 = len(list0) if len(list0)<=len(list1) else len(list1)
  5.    while(i<len0):
  6.       list3.append(list0[i])
  7.       list3.append(list1[i])
  8.       i+=1
  9.    list3.extend(list0[len0:len(list0)])
  10.    list3.extend(list1[len0:len(list1)])
  11.    return list3
复制代码

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2017-8-23 15:52:33 | 显示全部楼层
chunchun2017 发表于 2017-8-23 12:35
天天都在等每日一题,但是为什么82,83都没在今日热门和最新发布中看到呢?这个还是偶然看到了,居然是前天 ...

当然有奖励了。在这里可以看到所有的题目。
http://bbs.fishc.com/forum.php?m ... n=view&ctid=588
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-23 15:59:51 | 显示全部楼层
冬雪雪冬 发表于 2017-8-23 15:52
当然有奖励了。在这里可以看到所有的题目。
http://bbs.fishc.com/forum.php?mod=collection&action=vie ...

谢谢,麻麻再也不用担心我找不到题目了,哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-8 19:45:50 | 显示全部楼层
hao
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-4 14:42:23 | 显示全部楼层
  1. def joinList(listA, listB):
  2.     lengthA = len(listA)
  3.     lengthB = len(listB)
  4.     resultList = []
  5.     if lengthA <= lengthB:
  6.         for i in range(lengthA):
  7.             resultList.append(listA[i])
  8.             resultList.append(listB[i])
  9.         resultList += listB[lengthA:]
  10.     else:
  11.         for i in range(lengthB):
  12.             resultList.append(listA[i])
  13.             resultList.append(listB[i])
  14.         resultList += listA[lengthB:]
  15.     return resultList

  16. a = ['A0', 'A1', 'A2', 'A3', 'A4', 'A5']
  17. b = ['B0', 'B1', 'B2', 'B3', 'B4', 'B5']
  18. print(joinList(a,b))
  19. a = ['A0', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7']
  20. b = ['B0', 'B1', 'B2', 'B3']
  21. print(joinList(a,b))
  22. a = ['A0', 'A1', 'A2']
  23. b = ['B0', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6']
  24. print(joinList(a,b))

  25. ##
  26. ##    >>>
  27. ##    ['A0', 'B0', 'A1', 'B1', 'A2', 'B2', 'A3', 'B3', 'A4', 'B4', 'A5', 'B5']
  28. ##    ['A0', 'B0', 'A1', 'B1', 'A2', 'B2', 'A3', 'B3', 'A4', 'A5', 'A6', 'A7']
  29. ##    ['A0', 'B0', 'A1', 'B1', 'A2', 'B2', 'B3', 'B4', 'B5', 'B6']
  30. ##    >>>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-8 20:05:57 | 显示全部楼层
def merge(list1,list2):
    list3=[]
    if len(list1)==len(list2):
        for a in range(0,len(list1)):
            list3.extend([list1[a],list2[a]])
    if len(list1)<len(list2):
        for b in range(0,len(list1)):
            list3.extend([list1[b],list2[b]])
        for c in range(len(list2)-len(list1)-1,len(list2)):
            list3.append(list2[c])

    if len(list1)>len(list2):
        for e in range(0,len(list2)):
            list3.extend([list1[e],list2[e]])

        for f in range(len(list1)-len(list2)-1,len(list1)):
            list3.append(list1[f])
    return list3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-28 23:38:35 | 显示全部楼层
  1. import itertools as it
  2. a = ['A0', 'A1', 'A2', 'A3', 'A4', 'A5']
  3. b = ['B0', 'B1', 'B2', 'B3', 'B4', 'B5']

  4. print([y for x in it.zip_longest(a,b) for y in x if y])

  5. #结果
  6. ['A0', 'B0', 'A1', 'B1', 'A2', 'B2', 'A3', 'B3', 'A4', 'B4', 'A5', 'B5']
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-29 00:05:45 | 显示全部楼层
楼主辛苦了。。。。。。。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 05:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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