使用python3迭代字符串

2024-06-28 19:34:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用map,reduce,filter以一种更为python的方式编写这段代码。有人能帮我吗。你知道吗

这是一段简单的代码,它根据字符串在字符串中的位置为字符串赋值。 例如,对于字符串abaacab

a b a a c a b
1   2 3   4    occurrence of a
  1         2  occurrence of b
        1      occurrence of c
1+1+2+3+1+4+2 = 14

import sys
check, total = {}, 0
for i, v in enumerate(sys.argv[1]):
    if v in check:
        check[v] += 1
    else:
        check[v] = 1
    total += check[v]
print(total)

Tags: of字符串代码inimportmapreducecheck
3条回答

如果您想以当前的方式计算结果,我认为您当前的代码与python代码差不多(唯一的例外是不必要的enumerate调用)。你知道吗

然而,我认为有一个更好的方法来找到你的total,而不是在你做计数的时候把它们加起来。每一个值所贡献的总数的一部分可以直接从该值的最终计数中计算出来(它是一个三角形数字)。这意味着您可以一次性计算值,并在最后计算出总数。你知道吗

我是这样做的:

import sys
import collections

counts = collections.Counter(sys.argv[1])
total = sum(n * (n+1) // 2 for n in counts.values())
print(total)

如果你愿意的话,这里有另一个答案,那就是你想做什么就做什么。Python3兼容,尚未在Python2上测试。你知道吗

from functools import reduce, partial
total = reduce(lambda x, y: x + y, map(lambda x: x * (x + 1) // 2,  map(partial(str.count, sys.argv[1]), set(sys.argv[1]))))
print(total)

输出

14

分解:

partial(str.count, sys.argv[1]) ---- (1)定义一个高阶函数,map将应用于sys.argv。这样,就创建了计数。最后的答案不需要dict,所以它不会被创建。你知道吗

map(---(1)---, set(sys.argv[1])) ---- (2)应用部分函数(1)

map(lambda x: x * (x + 1) // 2, ----(2)----) ----(3)获取由(2)生成的计数,然后应用AP来获得总和。你知道吗

reduce(lambda x, y: x + y, ----(3)----)用(3)中的和的总和来结束它。你知道吗

import sys
val = {v : sys.argv[1].count(v) for v in set(sys.argv[1])}
total = sum(val[k] * (val[k] + 1) // 2  for k in val)

三行。。。一个导入和两行香草Python。你知道吗

第一行创建字符到计数的映射。然后,第二行查找列表中每个字符的序列和,用第二行sum求每个字符的总和。你知道吗

输出:

val: {'a': 4, 'c': 1, 'b': 2}
total: 14

警告:这不是有效的,因为它计算每个字符的计数(线性复杂度)。你知道吗

相关问题 更多 >