【问题标题】:Count in Python Lambda Function在 Python Lambda 函数中计数
【发布时间】:2016-01-11 20:33:00
【问题描述】:

我正在用 Python 学习 Lambda,为了学习,我想在 Lambda 中实现所有内容 - 我阅读了很多帖子,因此编写神秘的 lambda 代码并不是一个好主意。但是,此练习仅供学习。

给定一个数字和字符列表,计算数字和字符的个数

使用 lambda 实现以下内容

mylist = ['abc', '123', '758', 'cde']

d =0
c =0
for l in mylist:
        if l.isdigit():
                d+=1;
        if l.isalpha():
                c+=1

print d, c

如果你也能解释一下解决方案,那就太好了!

到目前为止我已经尝试过,我只能得到一个变量

mylist = "abc 123 758 cde"
print reduce(lambda x, y: x+y, map(lambda x: x.isdigit(),mylist.split(' ')))

【问题讨论】:

  • 尝试自己写。如果遇到麻烦,请返回特定问题/错误。
  • 欢迎来到 StackOverflow。请按照帮助文档进行发布,在这种情况下尤其是stackoverflow.com/help/mcve。我们不是编码或教程服务:我们希望您在自己的工作中好好尝试——然后当您遇到实施细节时我们会提供帮助。
  • 这对于 lambda 来说是个糟糕的选择。不要把扳手当锤子——使用每个工具来完成它的工作
  • 更新了我尝试过的内容

标签: python lambda reduce


【解决方案1】:

您可以将其实现为 lambda,但我真的希望您不会。它像罪恶一样丑陋,但用处却只有一半。

f = lambda lst: (sum(1 for el in lst if el.isdigit()),
                 sum(1 for el in lst if el.isalpha()))

mylst = ['abc', '123', '758', 'cde']

f(mylst)  # (2, 2)

【讨论】:

  • 至少你得到一个 dict 的概览:codedict(map(lambda x: (x, mylist.count(x)), set(mylist))) {'123': 2, 'cde': 1, '758': 1, 'abc': 1}
  • @MaxKleiner 这似乎不是问题所在。他们想要计算所有通过s.isdigit() 的字符串和所有不通过的字符串。这只是计算唯一条目。就此而言,有一个 stdlib 模块可以帮助解决这个问题:collections.Counter。您的代码简化为 from collections import Counter; Counter(mylist)
  • 对,唯一的条目是 set(mylist) 的原因,用 code 使用 isdigit 进行了传递,但它不算数:>>> dict(map(lambda x: (x.isdigit(), mylist.count(x)), set(mylist))) {True: 1, False: 1}
  • @MaxKleiner 因为mylist.count(x) 正在计算'123' 中有多少mylist,而不是多少字符串实际上是数字字符串。
【解决方案2】:
apart from lambda there are other thrilling functional capabilities in python

# map isalpha on mylist, count True
ct = list(map(str.isalpha, mylist)).count(True)

print(ct)

2

# map isdigit on mylist, count True
ct = list(map(str.isdigit, mylist)).count(True)

print(ct)

2

【讨论】:

    【解决方案3】:
    d,c = reduce(lambda (x,y),(a,b): (x+a, y+b),
            [(e.isdigit(),e.isalpha()) for e in mylist],
            (0,0))
    

    它看起来够神秘吗?你想维护这样的代码吗?

    在 Python3 中变得更糟

    d, c = reduce(lambda x_y, a_b: (x_y[0]+a_b[0], x_y[1]+a_b[1]),
                  [(e.isdigit(), e.isalpha()) for e in mylist],
                  (0, 0))
    

    【讨论】:

    • 这也不是有效的 Python3 代码,因为你不能在 lambdas 中解包元组,所以它不安全。
    • @AChampion 括号真的打破了吗?我知道它们不是必需的,但我认为它有助于提高可读性(哈哈!)
    • 我们不能将“for e in mylist”转换为地图步骤吗?
    • @AdamSmith,是的,在 python3 中使用 lambda arg 列表中的括号导致 SyntaxError,括号用于元组解包,这在 Python 3 中不再可用
    • @Karoly Horvath - 感谢让我通过指点来解决这个问题! print reduce(lambda (x,y),(a,b): (x+a, y+b), map(lambda x: (1 if x.isalpha() else 0, 1 if x.isdigit() else 0), mylist), (0,0))
    猜你喜欢
    • 1970-01-01
    • 2018-04-23
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多