鱼C论坛

 找回密码
 立即注册
查看: 5714|回复: 62

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

[复制链接]
发表于 2018-9-12 21:17:15 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬雪雪冬 于 2018-9-15 20:14 编辑

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

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

题目:
两组整数,每组都是由不重复的数字组成,两组中各取一个数字,使得两个数字的差值的绝对值最小。
要求给出这两个数字和差值的绝对值。如果有多种可能只要给出一种即可。
例如:
[-27, 184, 76, 193, 30, -96, 186, -61, 43, -94]
[166, 28, 47, 83, 15, 26, 153, 188, 43, 110]
每组都含有43,所以结果是43, 43, 0(第一组的数字。第二组的数字,差值的绝对值)

[-62, 167, 121, 72, 57, -21, 129, 173, -80, 35]
[12, -6, 39, -11, 197, -47, -90, 28, 51, 190]
结果35, 39, 4

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2018-9-12 21:53:27 | 显示全部楼层
  1. def fun208(list1,list2):
  2.     temp1 = list1[0]
  3.     temp2 = list2[0]
  4.     min_diff = abs(temp1-temp2)
  5.     for each1 in list1:
  6.         for each2 in list2:
  7.             temp = abs(each1-each2)
  8.             if temp < min_diff:
  9.                 min_diff = temp
  10.                 temp1 = each1
  11.                 temp2 = each2
  12.     print('%d, %d, %d' %(temp1,temp2,min_diff))

  13. if __name__ == '__main__':
  14.     list1 = [-27, 184, 76, 193, 30, -96, 186, -61, 43, -94]
  15.     list2 = [166, 28, 47, 83, 15, 26, 153, 188, 43, 110]
  16.     list3 = [-62, 167, 121, 72, 57, -21, 129, 173, -80, 35]
  17.     list4 = [12, -6, 39, -11, 197, -47, -90, 28, 51, 190]
  18.     fun208(list1,list2)
  19.     fun208(list3,list4)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-12 21:56:49 | 显示全部楼层
  1. def fun208(x,y):
  2.     x.sort()
  3.     y.sort()
  4.     if x[0]>=y[-1]:
  5.         return x[0],y[-1],abs(x[0]-y[-1])
  6.     elif y[0]>=x[-1]:
  7.         return y[0],x[-1],abs(y[0]-x[-1])
  8.     else:
  9.         X,Y,T=x[0],y[0],abs(x[0]-y[0])
  10.         for m in x:
  11.             for n in y:
  12.                 t=abs(m-n)
  13.                 if t<T:
  14.                    X,Y,T=m,n,t
  15.         return X,Y,T
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-12 22:21:31 | 显示全部楼层
还没想出好办法
双层循环虽然能容易得出结果,但是映射出两列表的数值太麻烦
如果是大数据列表,循环是不可行的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-12 22:55:54 | 显示全部楼层
  1. >>> def get( x, ns ):
  2.         for i in range(len(ns)):
  3.                 y = ns[i]
  4.                 if y == x:
  5.                         return (x,)
  6.                 if y > x:
  7.                         return (y,) if i==0 else (y,ns[i-1])
  8.                 if i == len(ns)-1:
  9.                         return (y,)

  10.                
  11. >>> def fun( ls, ns ):
  12.         ls = sorted(ls)
  13.         ns = sorted(ns)
  14.         r = [ls[0], ns[0], abs(ls[0]-ns[0])]
  15.         for i in range(len(ls)):
  16.                 x = ls[i]
  17.                 for t in get(x,ns):
  18.                         a = abs(x-t)
  19.                         if a == 0:
  20.                                 return (x,x,0)
  21.                         if a < r[2]:
  22.                                 r[:] = [x,t,a]
  23.         return tuple(r)

  24. >>> fun([-27, 184, 76, 193, 30, -96, 186, -61, 43, -94], [166, 28, 47, 83, 15, 26, 153, 188, 43, 110])
  25. (43, 43, 0)
  26. >>> fun([-62, 167, 121, 72, 57, -21, 129, 173, -80, 35], [12, -6, 39, -11, 197, -47, -90, 28, 51, 190])
  27. (35, 39, 4)
  28. >>>
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-12 23:00:06 | 显示全部楼层
  1. def ab(a,b):
  2.     dic={}
  3.     for each in a:
  4.         for c in b:
  5.             dic[str(each)+','+str(c) ] = abs(each - c)
  6.     return dic

  7. a = [-27, 184, 76, 193, 30, -96, 186, -61, 43, -94]
  8. b = [166, 28, 47, 83, 15, 26, 153, 188, 43, 110]
  9. c = [-62, 167, 121, 72, 57, -21, 129, 173, -80, 35]
  10. d = [12, -6, 39, -11, 197, -47, -90, 28, 51, 190]
  11. x = 100000000000
  12. x2 = 100000000000
  13. s = ""
  14. s2 = ""
  15. dic = ab(a,b)
  16. dic2 = ab(c,d)
  17. for i in dic:
  18.     if x > dic[i]:
  19.         x = dic[i]
  20.         s = i
  21. for i in dic2:
  22.     if x2 > dic2[i]:
  23.         x2 = dic2[i]
  24.         s2 = i
  25. print(s + ',' + str(x))
  26. print(s2 + ',' + str(x2))
  27.    
复制代码

>>>
==================== RESTART: C:\Users\**\Desktop\test.py ====================
43,43,0
35,39,4
>>>

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-12 23:41:30 From FishC Mobile | 显示全部楼层
本帖最后由 拉了盏灯 于 2018-9-12 23:53 编辑
  1. import itertools
  2. def fun208(list1,list2):
  3.         iter=itertools.product(list1,list2,repeat=1)
  4.         l={str(i):abs(i[0]-i[1]) for i in iter}
  5.         s=min(l,key=lambda x:l[x])
  6.         print(str(s).strip('()')+', %d'%l[s])
  7. fun208([-62, 167, 121, 72, 57, -21, 129, 173, -80, 35],[12, -6, 39, -11, 197, -47, -90, 28, 51, 190])
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-13 01:30:48 | 显示全部楼层
  1. import random

  2. A = list(set([ random.randint(-200, 200) for x in range(20) ]))
  3. B = list(set([ random.randint(-200, 200) for x in range(20) ]))

  4. print(A)
  5. print(B)

  6. C = [ 0, 0, 1000 ]

  7. for i in A:
  8.     for j in B:
  9.         if abs(i - j) < C[ 2 ]:
  10.             C[ 0 ], C[ 1 ], C[ 2 ] = i, j, abs(i - j)
  11. print(C)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-13 09:06:21 | 显示全部楼层
  1. num1 = [-62, 167, 121, 72, 57, -21, 129, 173, -80, 35]
  2. num2 = [12, -6, 39, -11, 197, -47, -90, 28, 51, 190]
  3. num3 = {}
  4. for x in num1:
  5.     for y in num2:
  6.         num3[x,y] = abs(x - y)
  7. num3 = sorted(num3.items(),key = lambda z:z[1])
  8. print(num3[0])
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-13 09:36:38 | 显示全部楼层
  1. def fun208(m,n):
  2.     min_=max(m)
  3.     for i in m :
  4.         for ii in n :
  5.             if abs(i-ii)<min_:
  6.                 x,y = i,ii
  7.                 min_= abs(i-ii)
  8.     print('结果为:%d,%d,%d'%(x,y,min_))

  9.    
  10. if __name__ == '__main__':
  11.     m = [-62, 167, 121, 72, 57, -21, 129, 173, -80, 35]
  12.     n = [12, -6, 39, -11, 197, -47, -90, 28, 51, 190]
  13.     fun208(m,n)
  14.    
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-13 10:23:41 | 显示全部楼层
  1. def func208(list1,list2):
  2.     flag1=list1[0]
  3.     flag2=list2[0]
  4.     for each1 in list1:
  5.         for each2 in list2:
  6.             if abs(each1-each2)<abs(flag1-flag2):
  7.                 flag2=each2
  8.                 flag1=each1
  9.     print(flag1,flag2,abs(flag1-flag2))


  10. list1=[-62, 167, 121, 72, 57, -21, 129, 173, -80, 35]
  11. list2=[12, -6, 39, -11, 197, -47, -90, 28, 51, 190]
  12. func208(list1,list2)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-13 10:25:23 | 显示全部楼层
  1. def q208(list1,list2):
  2.     result = []
  3.     for i in range(len(list1)):
  4.         for j in range(len(list2)):
  5.             result.append([abs(list1[i] - list2[j]),list2[j],list1[i]])
  6.     result.sort()
  7.     print(str(result[0][::-1]).strip("[]"))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-13 10:26:42 | 显示全部楼层
  1. def func208(l1, l2):
  2.     #暴力方法,直接循环l1和l2求出每一个差值比较
  3.     tmp = [0, 0, float("inf")]
  4.     for i in l1:
  5.         for j in l2:
  6.             if i == j:
  7.                 return i, j, 0
  8.             elif abs(i - j) < abs(tmp[2]):
  9.                 tmp = [i, j, i - j]
  10.     return tmp

  11. import time
  12. l1 = [-62, 167, 121, 72, 57, -21, 129, 173, -80, 35]
  13. l2 = [12, -6, 39, -11, 197, -47, -90, 28, 51, 190]
  14. start = time.time()
  15. print(func208(l1, l2))
  16. print(time.time()-start)
复制代码

先放一个不考虑效率的。

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3 差值要绝对值

查看全部评分

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

使用道具 举报

发表于 2018-9-13 11:04:09 | 显示全部楼层
a=[-62, 167, 121, 72, 57, -21, 129, 173, -80, 35]
b=[12, -6, 39, -11, 197, -47, -90, 28, 51, 190]
a.sort()
b.sort()
dmax=abs(a[-1]-b[0])
res=[a[-1],b[0],dmax]
for aa in a:
        d=dmax
        for bb in b:
                if abs(bb-aa)>d:
                        break
                d=abs(bb-aa)
                n+=1
                if d<res[2]:
                        res=[aa,bb,d]
        if d==0:
                break
print(res)

点评

n没有定义  发表于 2018-9-15 20:25
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-9-13 11:20:56 | 显示全部楼层
#提高一下效率:先把两个数组合并起来排个序。如果相邻数据在不同的原数组,判断其是否可能是最小值。
a=[-62, 167, 121, 72, 57, -21, 129, 173, -80, 35]
b=[12, -6, 39, -11, 197, -47, -90, 28, 51, 190]
ab=[(aa,1) for aa in a]+[(bb,2) for bb in b]
ab.sort()
res=[ab[-1][0],ab[0][0],abs(ab[-1][0]-ab[0][0])]
for i in range(1,len(ab)):
        if ab[i][1]!=ab[i-1][1]:
                d=abs(ab[i][0]-ab[i-1][0])               
                if d<res[2]:
                        res=[ab[i][0],ab[i-1][0],d]
                        if d==0:
                                break
print(res)

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-13 11:27:02 | 显示全部楼层
n = int(input('请输入第一组数的个数'))
a = []
for i in range(n):
    print('请输入第'+str(i+1),'个元素')
    x = int(input())
    a.append(x)
m = int(input('请输入第二组数的个数'))
b = []
for i in range(m):
    print('请输入第'+str(i+1),'个元素')
    x = int(input())
    b.append(x)

min_a = 0
min_b = 0
min_abs = abs(a[0]-b[0])
for i in a :
    for x in b:
        result = abs(x-i)
        if result < min_abs:
            min_abs = result
            min_a = i
            min_b = x
        if min_abs = 0:
            break
print(min_a, min_b, min_abs)

点评

if min_abs = 0: 是 ==  发表于 2018-9-15 20:28

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-13 11:53:49 | 显示全部楼层
  1. def getMin(list1, list2, list3=[]):
  2.     for i in list1:
  3.         for j in list2:
  4.             if not len(list3):
  5.                 list3.append(i)
  6.                 list3.append(j)
  7.                 list3.append(abs(i - j))
  8.             if list3[2] > abs(i - j):
  9.                 list3[0] = i
  10.                 list3[1] = j
  11.                 list3[2] = abs(i - j)
  12.     return list3
复制代码

点评

不如把list3=[]放到函数里,现在这样多次调用会出错  发表于 2018-9-15 20:31

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-13 13:36:12 | 显示全部楼层
def gaps(a=[],b=[])
    gap = abs(float(a[0])- float(b[0]))
    for x in a:
        x = float(x)
        for y in b:
            y = float(y)
            if gap >= abs(x - y):            
                gap = abs(x - y)
                a0 = x
                b0 = y
    print("差值绝对值最小为:%s,两个数分别为:%s,%s"%(gap,a0,b0))
while 1:
    try:
        a = input("请以列表形式输入一组数:")
        b = input("请以列表形式输入一组数:")
    except:
        print("输入数据有误!")
    gaps(a,b)
想自动输入两组数来着,总是报错,搞不定,求助下

点评

用eval函数吧,另第一行缺少冒号  发表于 2018-9-15 20:34

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-13 13:59:50 | 显示全部楼层
  1. list1=[-62, 167, 121, 72, 57, -21, 129, 173, -80, 35]
  2. list2=[12, -6, 39, -11, 197, -47, -90, 28, 51, 190]
  3. list3=[]
  4. a=abs(list1[0]-list2[0])
  5. for i in list1:
  6.     if i in list2:
  7.         list3=[i,i,i-i]
  8.         break
  9.     for j in list2:
  10.         b=abs(i-j)
  11.         if b<=a:
  12.             list3=[i,j,b]
  13.             a=b
  14. print(list3)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-13 14:09:07 | 显示全部楼层
本帖最后由 IChoose 于 2018-9-13 14:28 编辑

改了一下
def gaps(a=[],b=[]):
    gap = abs(a[0]- b[0])
    for x in a:
        for y in b:
            if gap >= abs(x - y):            
                gap = abs(x - y)
                a0 = x
                b0 = y
    print("两个数分别为:%s,%s,差值绝对值最小为:%s,"%(a0,b0,gap))
while 1:
    try:
        a = eval(input("请以列表形式输入一组数(列表:[a,b,c,d...]):"))
        b = eval(input("请以列表形式输入另一组数(列表:[a,b,c,d...]):"))
    except:
        print("输入数据有误!")
    gaps(a,b)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 00:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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