鱼C论坛

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

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

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

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

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

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

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

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

字符的话,要改成
import numpy as np 
def merge(list1, list2):
        maxlen = max(len(list1),len(list2))
        list3 = np.zeros((maxlen,1), dtype='str')
        list4 = np.zeros((maxlen,1), dtype='str')
        list3[:len(list1),0] = list1[:]
        list4[:len(list2),0] = list2[:]
        return [i for i in np.concatenate((list3,list4), axis=1).reshape(1,-1)[0] if i]
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 | 显示全部楼层
def merge(list1,list2):
    list3 = []
    a = min(len(list1),len(list2))
    for i in range(a):
        list3.extend([list1[i],list2[i]])

    list3.extend(list1[a:]) if len(list1)>len(list2) else list3.extend(list2[a:])
    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 | 显示全部楼层
感觉像是等长部分交错,然后接上后面超长部分?
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 | 显示全部楼层
楼主,答案有笔误
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 | 显示全部楼层
import copy


def merge(list1, list2):
    result_list = copy.deepcopy(list1)
    num = 1
    for x in list2:
        result_list.insert(num, x)
        num += 2
    return result_list

list1 = ['A0', 'A1', 'A2']
list2 = ['B0', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6']
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 | 显示全部楼层
def merge_list(list0,list1):
   list3 = []   
   i = 0
   len0 = len(list0) if len(list0)<=len(list1) else len(list1)
   while(i<len0):
      list3.append(list0[i])
      list3.append(list1[i])
      i+=1
   list3.extend(list0[len0:len(list0)])
   list3.extend(list1[len0:len(list1)])
   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 | 显示全部楼层
def joinList(listA, listB):
    lengthA = len(listA)
    lengthB = len(listB)
    resultList = []
    if lengthA <= lengthB:
        for i in range(lengthA):
            resultList.append(listA[i])
            resultList.append(listB[i])
        resultList += listB[lengthA:]
    else:
        for i in range(lengthB):
            resultList.append(listA[i])
            resultList.append(listB[i])
        resultList += listA[lengthB:]
    return resultList

a = ['A0', 'A1', 'A2', 'A3', 'A4', 'A5']
b = ['B0', 'B1', 'B2', 'B3', 'B4', 'B5']
print(joinList(a,b))
a = ['A0', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7']
b = ['B0', 'B1', 'B2', 'B3']
print(joinList(a,b))
a = ['A0', 'A1', 'A2']
b = ['B0', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6']
print(joinList(a,b))

##
##    >>> 
##    ['A0', 'B0', 'A1', 'B1', 'A2', 'B2', 'A3', 'B3', 'A4', 'B4', 'A5', 'B5']
##    ['A0', 'B0', 'A1', 'B1', 'A2', 'B2', 'A3', 'B3', 'A4', 'A5', 'A6', 'A7']
##    ['A0', 'B0', 'A1', 'B1', 'A2', 'B2', 'B3', 'B4', 'B5', 'B6']
##    >>> 
想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层
import itertools as it
a = ['A0', 'A1', 'A2', 'A3', 'A4', 'A5']
b = ['B0', 'B1', 'B2', 'B3', 'B4', 'B5']

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

#结果
['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-11-23 02:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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