鱼C论坛

 找回密码
 立即注册
查看: 4137|回复: 36

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

[复制链接]
发表于 2018-8-21 10:35:43 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬雪雪冬 于 2018-8-24 20:26 编辑

我们的玩法做了一下改变:

1. 楼主不再提供答案。
2. 请大家先独立思考,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。开始阶段是看不到其他人的回帖的,等答题完成,开始评分时再取消限制。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
zip函数大家都很熟悉,我抄录一下网上的说明:
zip() 函数用于将可迭代对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象。

如果各个可迭代对象的元素个数不一致,则返回的对象长度与最短的可迭代对象相同。

例如:
  1. >>> a = [1,2,3] #此处可迭代对象为列表
  2. >>> b = [4,5,6]
  3. >>> c = [4,5,6,7,8]
  4. >>> zipped = zip(a,b)
  5. >>> zipped
  6. <zip object at 0x02B01B48> #返回的是一个对象
  7. >>> list(zipped)
  8. [(1, 4), (2, 5), (3, 6)] #使用list()函数转换为列表
  9. >>> list(zip(a,c))
  10. [(1, 4), (2, 5), (3, 6)]
复制代码


这次我们自己编写一个类似的函数,与zip不同的是:如果各个可迭代对象的元素个数不一致,则返回的对象长度与最长的可迭代对象相同,不足的用None补齐。
例如:
  1. str1 = 'ABC'
  2. list1 = [1, 2, 3,[4, 5]]
  3. tuple1 = (1.1, 2.2)
  4. print(newzip(str1, list1, tuple1))
复制代码

返回:
  1. [('A', 1, 1.1), ('B', 2, 2.2), ('C', 3, None), (None, [4, 5], None)]
复制代码


注,你的程序可以返回一个列表,也可是用yield返回迭代器对象。

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2018-8-21 11:10:27 | 显示全部楼层
本帖最后由 凌九霄 于 2018-8-21 15:37 编辑
  1. def newzip(*args):
  2.     nargs = [ ]
  3.     lmax = sorted([ len(i) for i in args ], reverse=True)
  4.     for i in args:
  5.         i = list(i)
  6.         while len(i) < lmax[ 0 ]:
  7.             i.append(None)
  8.         nargs.append(i)
  9.     return zip(*nargs)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-8-21 11:22:15 | 显示全部楼层
本帖最后由 graceasyi 于 2018-8-21 11:27 编辑

# 方法一:list
  1. def newzip(*args):
  2.     ml = max([len(a) for a in args])    # 参数中最长的长度
  3.     result = []
  4.     for i in range(0, ml):
  5.         tup = ()
  6.         for a in range(0, len(args)):
  7.             try:
  8.                 tup += (args[a][i],)
  9.             except IndexError:
  10.                 tup += (None, )
  11.         result.append(tup)
  12.     return result


  13. str1 = 'ABC'
  14. list1 = [1, 2, 3, [4, 5]]
  15. tuple1 = (1.1, 2.2)
  16. print(newzip(str1, list1, tuple1))
复制代码

结果:
[('A', 1, 1.1), ('B', 2, 2.2), ('C', 3, None), (None, [4, 5], None)]

# 方法二:yield
  1. def newzip1(*args):
  2.     ml = max([len(a) for a in args])    # 参数中最长的长度
  3.     for i in range(0, ml):
  4.         tup = ()
  5.         for a in range(0, len(args)):
  6.             try:
  7.                 tup += (args[a][i],)
  8.             except IndexError:
  9.                 tup += (None, )
  10.         yield tup


  11. str1 = 'ABC'
  12. list1 = [1, 2, 3, [4, 5]]
  13. tuple1 = (1.1, 2.2)
  14. for r in newzip1(str1, list1, tuple1):
  15.     print(r)
复制代码

结果:
('A', 1, 1.1)
('B', 2, 2.2)
('C', 3, None)
(None, [4, 5], None)

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-8-21 11:44:07 | 显示全部楼层
本帖最后由 塔利班 于 2018-8-21 14:18 编辑
  1. def newzip(*p):
  2.     return [tuple((each[i] if i<len(each) else None for each in p)) for i in range(max([len(t) for t in p]))]
复制代码

  1. def newzip(*p):
  2.     for i in range(max([len(t) for t in p])):
  3.         yield tuple((each[i] if i<len(each) else None for each in p))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-8-21 11:46:27 | 显示全部楼层
  1. def newzip(*iterator):
  2.     lengths = []    #存储每个可迭代对象的长度
  3.     for each_iter in iterator:
  4.         lengths.append(len(each_iter))
  5.     max_len = max(lengths)

  6.     result = []
  7.     for i in range(max_len):
  8.         each_list = []
  9.    
  10.         for iter_num in range(len(iterator)):
  11.             #若索引值不小于可迭代对象长度,用None补齐
  12.             if i < lengths[iter_num]:
  13.                 each_list.append(iterator[iter_num][i])
  14.             else:
  15.                 each_list.append(None)
  16.                
  17.         result.append(tuple(each_list))
  18.         
  19.     return result

  20. if __name__ == '__main__':
  21.     str1 = 'ABC'
  22.     list1 = [1, 2, 3,[4, 5]]
  23.     tuple1 = (1.1, 2.2)
  24.     print(newzip(str1, list1, tuple1))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-8-21 11:53:46 | 显示全部楼层
本帖最后由 天圆突破 于 2018-8-21 12:22 编辑
  1. def func201(*args):
  2.     return list(zip(*map(lambda x:list(x)+[None for i in range(max(map(lambda x:len(x), args))-len(x))] , args)))
复制代码
  1. if __name__ == '__main__':
  2.     res = func201([1,2,3], [1], [])
  3.     print(res)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-8-21 12:49:33 | 显示全部楼层
def newzip(*arg):
    #取元祖最长的可迭代对象的长度
    n = len(sorted(arg,key=len)[-1])

    for i in range(n):
        a = ()
        for j in range(len(arg)):
            try:
                a += (arg[j][i],)
            except IndexError:
                a += (None,)
        yield a

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-8-21 13:23:07 | 显示全部楼层
  1. def newzip(*args):
  2.     lenth = 0
  3.     for i in args:
  4.         if len(i) > lenth:
  5.             lenth = len(i)
  6.     l = []
  7.     for i in range(lenth):
  8.         t = []
  9.         for each in args:
  10.             try:
  11.                 t.append(each[i])
  12.             except  IndexError:
  13.                 t.append(None)
  14.         l.append(tuple(t))
  15.     return l
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-8-21 13:59:59 | 显示全部楼层
本帖最后由 晓屁屁 于 2018-8-21 14:03 编辑

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

使用道具 举报

发表于 2018-8-21 14:03:23 | 显示全部楼层
  1. str1 = 'ABC'
  2. list1 = [1, 2, 3,[4, 5]]
  3. tuple1 = (1.1, 2.2)
  4. def new_zip(str1,list1,tuple1):
  5.     ziped = []
  6.     for i in range(max(len(str1),len(list1),len(tuple1))):
  7.         ziped.append(list())
  8.         try:
  9.             ziped[i].append(str1[i])
  10.         except:
  11.             ziped[i].append(None)
  12.         try:
  13.             ziped[i].append(list1[i])
  14.         except:
  15.             ziped[i].append(None)
  16.         try:
  17.             ziped[i].append(tuple1[i])
  18.         except:
  19.             ziped[i].append(None)
  20.     for i in range(len(ziped)):
  21.         yield tuple(ziped[i])
  22. for i in new_zip(str1,list1,tuple1):
  23.     print(i)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-8-21 14:12:54 | 显示全部楼层
def newzip(*args):
    temp = []
    args=list(args)
    length_args=len(args)
    length = len(sorted(args,key=lambda k:len(k),reverse=True)[0])
    for i in range(length):
        empty = []
        for j in range(length_args):
            try:
                empty.append(args[j][i])
            except IndexError:
                empty.append(None)
        temp.append(tuple(empty))
    return temp
               
newzip([0,1,2],[5,1,5],[3,2,1,5])

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-8-21 16:03:40 | 显示全部楼层
本帖最后由 chongchuigu 于 2018-8-21 16:05 编辑
  1. str1 = 'ABC'
  2. list1 = [1, 2, 3,[4, 5]]
  3. tuple1 = (1.1, 2.2)
  4. def a201(*nums):
  5.         length=[]
  6.         for i in nums:
  7.                 length.append(len(i))
  8.         maxnums=max(length)
  9.         newlist=[]
  10.         for i in range(maxnums):
  11.                 for j in nums:
  12.                         try:
  13.                                 newlist.append(j[i])
  14.                         except IndexError:
  15.                                 newlist.append(None)
  16.         result=[(tuple(newlist[i:i+len(nums)])) for i in range(0,len(newlist),len(nums))]
  17.         return result

  18. print(a201(str1,list1,tuple1))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-8-21 16:20:38 | 显示全部楼层
  1. def newzip(it_p1,it_p2,it_p3):
  2.     len1 = len(it_p1)
  3.     len2 = len(it_p2)
  4.     len3 = len(it_p3)
  5.     len_max = max(len1,len2,len3)
  6.     res = []
  7.     for i in range(len_max):
  8.         temp_tuple = []
  9.         if len1 > i:
  10.             temp_tuple.append(it_p1[i])
  11.         else:
  12.             temp_tuple.append(None)
  13.         if len2 > i:
  14.             temp_tuple.append(it_p2[i])
  15.         else:
  16.             temp_tuple.append(None)
  17.         if len3 > i:
  18.             temp_tuple.append(it_p3[i])
  19.         else:
  20.             temp_tuple.append(None)
  21.         res.append(tuple(temp_tuple))
  22.     return res

  23. str1 = 'ABC'
  24. list1 = [1, 2, 3,[4, 5]]
  25. tuple1 = (1.1, 2.2)
  26. print(newzip(str1, list1, tuple1))
复制代码
1.png

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-8-21 16:36:58 | 显示全部楼层
def newzip(*args):
    maxlen=0
    minlen=len(args[0])
    for i in args:
        if len(i)>maxlen:
            maxlen=len(i)
        elif len(i)<minlen:
            minlen=len(i)
        list1=[]

    for i in range(minlen):
        list2=[]
        for j in args:
            list2.append(j[i])
        list3=tuple(list2)
        list1.append(list3)

    for i in range(minlen,maxlen):
        list2=[]
        for j in args:
            try:
                list2.append(j[i])
            except IndexError as f:
                list2.append('None')
        list3=tuple(list2)
        list1.append(list3)
    return list1

点评

是None,不是'None'  发表于 2018-8-24 20:38

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-8-21 16:41:04 | 显示全部楼层
本帖最后由 Wangzy1025 于 2018-8-23 09:48 编辑
  1. def fun201(*iter):
  2.     max_len, list_temp = max([len(x) for x in iter]), [list(x) for x in iter]
  3.     for each in list_temp:
  4.         if len(each) < max_len:
  5.             for i in range(max_len - len(each)):
  6.                 each.append(None)
  7.     for i in range(max_len):
  8.         temp = []
  9.         for each in list_temp:
  10.             temp.append(each[i])
  11.         yield tuple(temp)


  12. str1 = 'ABC'
  13. list1 = [1, 2, 3,[4, 5]]
  14. tuple1 = (1.1, 2.2)
  15. print(list(fun201(str1, list1, tuple1)))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-8-21 16:42:29 | 显示全部楼层
精简一下:
def newzip(*args):
    maxlen=0
    for i in args:
        if len(i)>maxlen:
            maxlen=len(i)
    list1=[]
    for i in range(0,maxlen):
        list2=[]
        for j in args:
            try:
                list2.append(j[i])
            except IndexError as f:
                list2.append('None')
        list3=tuple(list2)
        list1.append(list3)
    return list1
str1 = 'ABC'
list1 = [1, 2, 3,[4, 5]]
tuple1 = (1.1, 2.2)
print(newzip(str1, list1, tuple1))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-21 17:17:56 | 显示全部楼层
  1. def newzip(*args):
  2.     num = len(args)
  3.     count = 0
  4.     for i in range(num):
  5.         if len(args[i]) > count:
  6.             count = len(args[i])
  7.     for i in range(count):
  8.         tmp = []
  9.         for j in range(num):
  10.             try:
  11.                 tmp.append(args[j][i])
  12.             except:
  13.                 tmp.append(None)
  14.         yield tmp

  15. str1 = 'ABC'
  16. list1 = [1, 2, 3,[4, 5]]
  17. tuple1 = (1.1, 2.2)
  18. for i in newzip(str1, list1, tuple1):
  19.     print(i)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-8-21 22:57:18 | 显示全部楼层
  1. >>> def newzip( *ls ):
  2.         m = max(len(x) for x in ls)
  3.         r = []
  4.         for i in range(m):
  5.                 r.append(tuple(x[i] if i < len(x) else None for x in ls))
  6.         return r

  7. >>> str1 = 'ABC'
  8. >>> list1 = [1, 2, 3,[4, 5]]
  9. >>> tuple1 = (1.1, 2.2)
  10. >>> r = newzip(str1, list1, tuple1)
  11. >>> r
  12. [('A', 1, 1.1), ('B', 2, 2.2), ('C', 3, None), (None, [4, 5], None)]
  13. >>> newzip(str1)
  14. [('A',), ('B',), ('C',)]
  15. >>>
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-8-21 23:03:07 | 显示全部楼层
  1. #coding:utf-8

  2. #自己编写一个类似的函数,与zip不同的是:如果各个可迭代对象的元素个数不一致
  3. # 则返回的对象长度与最长的可迭代对象相同,不足的用None补齐。

  4. def newzip(*args):
  5.     c = []
  6.     for i in args:
  7.         c.append(len(i))
  8.     num = max(c)
  9.     # print(num)
  10.     e = []
  11.     for m in range(num):
  12.         # print(m)
  13.         d = []
  14.         for n in args:
  15.             try:
  16.                 if n[m] not in n:
  17.                     d.append(None)
  18.                 else:
  19.                     d.append(n[m])
  20.             except:
  21.                 d.append(None)
  22.             tupple = tuple(d)
  23.         e.append(tupple)
  24.     # print(e)
  25.     return e

  26. str1 = 'ABC'
  27. list1 = [1, 2, 3, [4, 5]]
  28. tuple1 = (1.1, 2.2)
  29. str2 = '1'
  30. print(newzip(str1,list1,tuple1,str2))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-8-22 00:17:29 | 显示全部楼层
  1. def newzip(*seq):
  2.     seq=list(seq)
  3.     max_value=max([len(each_item) for each_item in seq])
  4.     for x in range(len(seq)):
  5.         seq[x]=list(seq[x])
  6.     for each_item in seq:
  7.         for n in range(max_value-len(each_item)):
  8.             each_item.append(None)
  9.     return [tuple([each_item[each_value] for each_item in seq]) for each_value in range(max_value)]
复制代码

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 21:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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