Estinien 发表于 2021-6-24 13:21:18

python的函数问题

编写一个函数,common(list1, list2),它返回一个字典。 字典中的每个键对应两个列表中的一个元素。 每个键的值是该元素在两个列表中出现的次数。 有关示例,请参阅下面的测试单元。

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

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

Multiple-x 发表于 2021-6-24 13:21:19



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"]))

z5560636 发表于 2021-6-24 13:49:17



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"]))

z5560636 发表于 2021-6-24 13:52:47



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

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

nahongyan1997 发表于 2021-6-24 13:53:20

简单明了:
def clac(list1,list2):
    list1.extend(list2)
    new_list = list(set(list1))
    result = {}
    for n in new_list:
      result = list1.count(n)
      
    return result


print(clac(,))

nahongyan1997 发表于 2021-6-24 14:09:29

再给你个进阶版的,不限制输入了几个列表,一个也行一百个也行。
def clac(*lists):
    _list = []
    for each in lists:
      _list.extend(each)
      
    not_repeat = set(_list)
    result = {}
    for n in not_repeat:
      result = _list.count(n)
      
    return result


print(clac(,))

qq1151985918 发表于 2021-6-24 15:26:38

def common(list1, list2):
      return {i:(list1+list2).count(i) for i in set(list1+list2)}

Estinien 发表于 2021-6-24 18:43:42

{:10_245:}

nahongyan1997 发表于 2021-6-24 20:41:06

qq1151985918 发表于 2021-6-24 15:26


我靠,字典推导式

阿奇_o 发表于 2021-6-24 23:19:03


def common(ls1, ls2):
   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))}

永恒的蓝色梦想 发表于 2021-6-25 10:38:11

以上使用 .count() 的代码全都效率爆炸,个人认为2#代码比较好

nahongyan1997 发表于 2021-6-25 11:06:55

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

玩c 语言的大佬看问题的角度就是不一样,顺便请教下 .count 和 if ... in ... 的执行原理

永恒的蓝色梦想 发表于 2021-6-25 11:16:58

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

并不是大佬,也是初学者而已
list 的 .count 和 in 其实就相当于这样def count(list, val):
    result = 0

    for i in list:
      if i == val:
            result += 1

    return resultdef __contain__(list, val):
    for i in list:
      if i == val:
            return True
    return False

夜莫 发表于 2021-6-27 00:04:02

def common(list1,list2):
    countDict = {}
    for i in (list1+list2):
      countDict = countDict.get(i,0)+1
    return countDict

nahongyan1997 发表于 2021-6-27 09:28:53

夜莫 发表于 2021-6-27 00:04
def common(list1,list2):
    countDict = {}
    for i in (list1+list2):


新奇

夜莫 发表于 2021-6-27 11:52:13

nahongyan1997 发表于 2021-6-27 09:28
新奇

代码讲究效率

徐露琦 发表于 2021-6-27 14:35:15

6666我也不知道呀
页: [1]
查看完整版本: python的函数问题