鱼C论坛

 找回密码
 立即注册
查看: 2806|回复: 16

[已解决]python的函数问题

[复制链接]
发表于 2021-6-24 13:21:18 | 显示全部楼层 |阅读模式
10鱼币
编写一个函数,common(list1, list2),它返回一个字典。 字典中的每个键对应两个列表中的一个元素。 每个键的值是该元素在两个列表中出现的次数。 有关示例,请参阅下面的测试单元。

assert common(["a", "b", "a", "d", "f", "a"], ["a", "b", "d", "d", "e"]) == { "a": 4, "b": 2, "d": 3 }

提示:有多种方法可以解决此问题,但您可能会发现最简单的方法是构建至少两个中间字典和多个循环。
最佳答案
2021-6-24 13:21:19


def common(list1, list2):
    s = {}
    for i in list1:
        if i in s:
            s[i] += 1
        else:
            s[i] = 1
    for i in list2:
        if i in s:
            s[i] += 1
        else:
            s[i] = 1
    return s

print(common(["a", "b", "a", "d", "f", "a"], ["a", "b", "d", "d", "e"]))

最佳答案

查看完整内容

def common(list1, list2): s = {} for i in list1: if i in s: s += 1 else: s = 1 for i in list2: if i in s: s += 1 else: s = 1 return s print(common(["a", "b", "a", "d", "f", "a"], ["a", "b", "d", "d", "e"]))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-24 13:21:19 | 显示全部楼层    本楼为最佳答案   


def common(list1, list2):
    s = {}
    for i in list1:
        if i in s:
            s[i] += 1
        else:
            s[i] = 1
    for i in list2:
        if i in s:
            s[i] += 1
        else:
            s[i] = 1
    return s

print(common(["a", "b", "a", "d", "f", "a"], ["a", "b", "d", "d", "e"]))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-24 13:49:17 | 显示全部楼层


  1. def common(list1, list2):
  2.     s = {}
  3.     for i in list1:
  4.         if i in s:
  5.             s[i] += 1
  6.         else:
  7.             s[i] = 1
  8.     for i in list2:
  9.         if i in s:
  10.             s[i] += 1
  11.         else:
  12.             s[i] = 1
  13.     return s

  14. print(common(["a", "b", "a", "d", "f", "a"], ["a", "b", "d", "d", "e"]))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-24 13:52:47 | 显示全部楼层


  1. def common(list1, list2):
  2.     list3 = list1 + list2
  3.     s = {}
  4.     for i in list3:
  5.         if i in s:
  6.             s[i] += 1
  7.         else:
  8.             s[i] = 1
  9.     return s

  10. print(common(["a", "b", "a", "d", "f", "a"], ["a", "b", "d", "d", "e"]))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-24 13:53:20 | 显示全部楼层
简单明了:
  1. def clac(list1,list2):
  2.     list1.extend(list2)
  3.     new_list = list(set(list1))
  4.     result = {}
  5.     for n in new_list:
  6.         result[n] = list1.count(n)
  7.         
  8.     return result


  9. print(clac([123],[123]))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-24 14:09:29 | 显示全部楼层
再给你个进阶版的,不限制输入了几个列表,一个也行一百个也行。
  1. def clac(*lists):
  2.     _list = []
  3.     for each in lists:
  4.         _list.extend(each)
  5.         
  6.     not_repeat = set(_list)
  7.     result = {}
  8.     for n in not_repeat:
  9.         result[n] = _list.count(n)
  10.         
  11.     return result


  12. print(clac([123,1233],[123]))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-24 15:26:38 | 显示全部楼层
  1. def common(list1, list2):
  2.       return {i:(list1+list2).count(i) for i in set(list1+list2)}
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-6-24 18:43:42 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-24 20:41:06 | 显示全部楼层

我靠,字典推导式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-24 23:19:03 | 显示全部楼层

  1. def common(ls1, ls2):
  2.      return { i : (ls1+ls2).count(i) for i in ls1+ls2 if (i in ls1) and (i in ls2)}  
复制代码


# 注:从示例看出,是要两个列表共有的元素,故 if 判断一下。
或你转为集合取交集,如 {i:(list1+list2).count(i) for i in (set(list1) & set(list2))}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-25 10:38:11 | 显示全部楼层
以上使用 .count() 的代码全都效率爆炸,个人认为2#代码比较好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-25 11:06:55 | 显示全部楼层
永恒的蓝色梦想 发表于 2021-6-25 10:38
以上使用 .count() 的代码全都效率爆炸,个人认为2#代码比较好

玩c 语言的大佬看问题的角度就是不一样,顺便请教下 .count 和 if ... in ... 的执行原理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-25 11:16:58 | 显示全部楼层
nahongyan1997 发表于 2021-6-25 11:06
玩c 语言的大佬看问题的角度就是不一样,顺便请教下 .count 和 if ... in ... 的执行原理

并不是大佬,也是初学者而已

list 的 .count 和 in 其实就相当于这样
  1. def count(list, val):
  2.     result = 0

  3.     for i in list:
  4.         if i == val:
  5.             result += 1

  6.     return result
复制代码
  1. def __contain__(list, val):
  2.     for i in list:
  3.         if i == val:
  4.             return True
  5.     return False
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-27 00:04:02 | 显示全部楼层
def common(list1,list2):
    countDict = {}
    for i in (list1+list2):
        countDict[i] = countDict.get(i,0)+1
    return countDict
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-27 09:28:53 | 显示全部楼层
夜莫 发表于 2021-6-27 00:04
def common(list1,list2):
    countDict = {}
    for i in (list1+list2):

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

使用道具 举报

发表于 2021-6-27 11:52:13 | 显示全部楼层

代码讲究效率
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-27 14:35:15 | 显示全部楼层
6666我也不知道呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 13:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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