鱼C论坛

 找回密码
 立即注册
查看: 7556|回复: 45

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

[复制链接]
发表于 2017-11-20 19:00:49 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬雪雪冬 于 2017-11-26 20:15 编辑

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

1. 楼主不再提供答案。
2. 请大家先独立思考”,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。


题目:

已有一个没有重复的整数列表,如 [2, 10, -3, 9, 4, 3, 5, 7 ,12],有一个整数目标值,如9

这个目标值可能可以由列表中两个数字相加得到,如 2 + 7,-3 + 12, 4 +5

建立一个函数

def fun(mylist, target):
    return 列表

要求返回的列表为如下形式:

[[2, 7], [-3, 12], [4, 5]]

如果仅有一个返回

[2, 7]

如果没有返回

[]

注:不要有重复的,如[2, 7]和[7, 2]

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2017-11-20 20:15:15 | 显示全部楼层
本帖最后由 SixPy 于 2017-11-20 20:28 编辑
  1. def fun(ls, target):   
  2.     return [[ls[x],ls[y]]for x in range(len(ls))
  3.                          for y in range(x+1,len(ls))
  4.                          if ls[x]+ls[y]==target]

  5. ls = [2, 10, -3, 9, 4, 3, 5, 7 ,12]
  6. print(fun(ls, 9))
  7. #[[2, 7], [-3, 12], [4, 5]]
复制代码

  1. import numpy as np
  2. a = np.array([2, 10, -3, 9, 4, 3, 5, 7 ,12])
  3. idx = np.where(np.triu(a+a.reshape(-1,1),1)==9)
  4. print(np.array([a[idx[0]],a[idx[1]]]).T.tolist())
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-20 20:50:22 | 显示全部楼层
本帖最后由 第四时空 于 2017-11-20 20:59 编辑
  1. def fun(mylist, target):
  2.     mylist = sorted(mylist)
  3.     result = []
  4.     for i in range(0, len(mylist)):
  5.         if mylist[i] > target / 2:
  6.             break
  7.         for j in range(i + 1, len(mylist)):
  8.             if mylist[i] + mylist[j] > target:
  9.                 break
  10.             if mylist[i] + mylist[j] == target:
  11.                 result.append([mylist[i], mylist[j]])
  12.     return result[0] if len(result) == 1 else result
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-20 20:53:18 | 显示全部楼层
两两组合,没有重复的列表···故意的嘛
  1. import itertools as it

  2. def fun(mylist, target):
  3.     return [list(i) for i in it.combinations(mylist, 2) if sum(i) == target]
复制代码

手动做的话,嵌套循环是笛卡尔积,
要排除掉自己加自己,还有位置相反的重复
  1. def fun2(mylist, target):
  2.     return [list(k) for k in
  3.             {frozenset([i,j]) for i in mylist for j in mylist if i!=j and i+j==target}]
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-20 22:48:29 | 显示全部楼层
  1. # 使用itertools库
  2. def fun(mylist, target):
  3.     from itertools import combinations
  4.     result = [list(i) for i in combinations(mylist,2) if sum(i)==target]
  5.     if len(result) == 1:
  6.         return result[0]
  7.     return result
  8. # 不使用itertools库
  9. def fun(mylist, target):
  10.     result = []
  11.     for i in mylist:
  12.         if (target - i) in mylist and mylist.index(i)<mylist.index(target-i):
  13.             result.append([i,target-i])
  14.     if len(result) == 1:
  15.         return result[0]
  16.     return result
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-21 08:49:58 | 显示全部楼层
  1. >>> a=[]
  2. >>> for i in range(len(l)):
  3.         for j in range(i,len(l)):
  4.                 if (l[i]+l[j]==9):
  5.                         a.append([l[i],l[j]])                       
  6. >>> a
  7. [[2, 7], [-3, 12], [4, 5]]
复制代码


评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-21 11:08:26 | 显示全部楼层
  1. list1=[]
  2. def fun(mylist,target):
  3.     for i in range(0,len(mylist)):
  4.         for j in range (i+1,len(mylist)):
  5.             if mylist[i] + mylist[j] ==target:
  6.                 list1.append([mylist[i],mylist[j]])
  7.     return list1
复制代码

点评

list1定义在函数外边,如果运行几次函数会把多次的结果放在一起。  发表于 2017-11-26 20:24

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3 list1定义在函数外边,如果运行几次函数会.

查看全部评分

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

使用道具 举报

发表于 2017-11-21 11:14:36 | 显示全部楼层
mark
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-21 14:31:52 | 显示全部楼层
  1. def fun(mylist,target):
  2.     result = []
  3.     for i in range(len(mylist)):
  4.         for each in mylist[i + 1:]:
  5.             if target == mylist[i] + each:
  6.                 temp = [mylist[i], each]
  7.                 result.append(temp)
  8.                 #mylist.remove(each)
  9.     return result
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-21 14:34:38 | 显示全部楼层
  1. def fun(ls, target):
  2.     result = []
  3.     for i in range(len(ls)-1):
  4.         for j in range(i+1, len(ls)):
  5.             if ls[i] + ls[j] == target:
  6.                 result.append([ls[i], ls[j]])

  7.     if len(result) == 1:
  8.         return result[0]
  9.     else:
  10.         return result

  11. list1 = [2, 10, -3, 9, 4, 3, 5, 7 ,12]
  12. print(fun(list1, 9))
复制代码

[[2, 7], [-3, 12], [4, 5]]

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-21 15:37:14 | 显示全部楼层
  1. def fun(mylist,target):
  2.     length = len(mylist)
  3.         
  4.     newlist = []
  5.     for i in range(length):
  6.         for j in range(length):
  7.             if target == mylist[i] + mylist[j]:
  8.                 newlist.append([mylist[i],mylist[j]])
  9.                 mylist[i] = True
  10.     return newlist
  11.   
  12. mylist=[2,10,-3,9,4,3,5,7,12]
  13. target = 9
  14. print(fun(mylist,target))
复制代码


点评

你看看把12,14行再运行一遍是什么结果  发表于 2017-11-26 20:30

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-21 19:40:24 | 显示全部楼层
  1. def fun(mylist,target):
  2.     returnedlist = []
  3.     for each in mylist:
  4.         for each1 in mylist:
  5.             if each+each1 == target:
  6.                 returnedlist.append([each,each1])
  7.     return returnedlist
复制代码

点评

有重复结果  发表于 2017-11-26 20:31

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-21 20:47:28 | 显示全部楼层
本帖最后由 口可口可 于 2017-11-27 22:10 编辑
  1. def fun(mylist, target):
  2.     result_list = []
  3.     mylist.sort()

  4.     for index1 in range(len(mylist)-1):
  5.         for index2 in range(index1+1, len(mylist)):
  6.             if mylist[index1] + mylist[index2] >= target:
  7.                 if mylist[index1] + mylist[index2] == target:
  8.                     result_list.append([mylist[index1], mylist[index2]])
  9.                 else:
  10.                     break

  11.     if len(result_list) == 1:
  12.         return result_list[0]
  13.     else:
  14.         return result_list
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-21 22:17:08 | 显示全部楼层
  1. def fun(a,target):
  2.             answer=[]
  3.             for i in range(len(a)):
  4.                         for j in range(i):
  5.                                     if i !=j and a[i]+a[j]== target :
  6.                                                 answer.append([a[i],a[j]])
  7.             return print(answer)
  8.                                                 
  9. fun([2, 10, -3, 9, 4, 3, 5, 7 ,12],9)
复制代码

点评

return print的写法不合适  发表于 2017-11-26 20:33

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-21 23:24:04 | 显示全部楼层
  1. def fun (mylist,target):
  2.     un=0
  3.     nilist=[]
  4.     while un < len(mylist):
  5.         for i in range(len(mylist)):
  6.             if i > un:
  7.                 a=int(mylist[i])
  8.                 c=a+int(mylist[un])
  9.                 if c == target:
  10.                    element=[a,mylist[un]]
  11.                    nilist.append(element)            
  12.         un += 1
  13.     return nilist
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-22 01:57:51 | 显示全部楼层
本帖最后由 yjsx86 于 2017-11-24 03:12 编辑
  1. L = [2, 10, -3, 9, 4, 3, 5, 7 ,12]
  2. def func(mylist, target):
  3.     newlist = mylist[:]
  4.     rs = []
  5.     for i in mylist:
  6.         for j in newlist:
  7.             if i + j == target:
  8.                 rs.append([i,j])
  9.         newlist.remove(i)
  10.     return rs[0] if len(rs) == 1 else rs

  11. #测试代码
  12. for x in range(10):
  13.     r = func(L,x)
  14.     print(r)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-22 10:27:18 | 显示全部楼层
我还是个初学者,这个有点难
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-22 11:10:29 | 显示全部楼层
  1. l1 = [2, 10, -3, 9, 4, 3, 5, 7 ,12]
  2. l2 = []
  3. def func(mylist,target):
  4.     while True:
  5.         num1 = mylist.pop()
  6.         for i in mylist:
  7.             if num1 + i == target:
  8.                 l2.append([num1, i])
  9.         if not(len(mylist)):
  10.             break
  11.     print(l2)

  12. func(l1,23)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3 再次调用函数出错

查看全部评分

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

使用道具 举报

发表于 2017-11-22 12:35:55 | 显示全部楼层
貌似参考不到其他人的答案呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-22 15:07:49 | 显示全部楼层
本帖最后由 sunboyabc 于 2017-11-22 16:12 编辑

def function1(list1=[2, 10, -3, 9, 4, 3, 5, 7 ,12],target=9):
    len1 = len(list1)
    for i1 in range(len1):
        for i2 in range(i1+1,len1):
            if list1[i1] + list1[i2] ==9 :
                print([list1[i1],list1[i2]])
           else:
                print([])

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-28 17:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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